Задача
По заданному списку строк найдите строки из списка, которые появляются в данном тексте.
Пример
list = ['red', 'hello', 'how are you', 'hey', 'deployed']
text = 'hello, This is shared right? how are you doing tonight'
result = ['red', 'how are you', 'hello']
'red', потому что у него 'shared' есть 'red' в качестве подстроки
- Это очень похоже на этот вопрос за исключением того, что слово, которое мы должны искать, также может быть подстрокой.
- Список довольно большой и увеличивается с увеличением количества пользователей, в отличие от текста, длина которого примерно одинакова.
- Я думал о том, чтобы найти решение, в котором сложность времени зависит от длины текста, а не от списка слов, чтобы его можно было масштабировать даже при добавлении большого количества пользователей.
Решение
- Я строю дерево из списка слов
- Запустите dfs для текста и проверьте текущее слово по дереву
псевдопользователей-код
def FindWord (trie, text, word_so_far, index):
index > len(text)
return
//Check if the word_so_far is a prefix of a key; if not return
if trie.has_subtrie(word) == false:
return
//Check if the word_so_far is a key; if ye add to result and look further
if trie.has_key(word) == false:
// Add to result and continue
//extend the current word we are searching
FindWord (trie, text, word_so_far + text[index], index + 1)
//start new from the next index
FindWord (trie, text, "", index + 1)
Проблема в том, что время выполнения теперь зависит от len(text)
, которое выполняется с временной сложностью O(2^n)
после построения дерева, которое является единовременным для нескольких текстов, так что все в порядке.
Я не вижу никаких перекрывающихся подзадач, чтобы запоминать и улучшать время выполнения.
Можете ли вы предложить какой-либо способ, которым я могу добиться времени выполнения, которое зависит от заданного текста, а не от списка слов, которые могут обрабатываться и кэшироваться, а также быстрее, чем это.