給定乙個較長字串big和乙個包含較短字串的陣列smalls,設計乙個方法,根據smalls中的每乙個較短字串,對big進行搜尋。輸出smalls中的字串在big裡出現的所有位置positions,其中positions[i]為smalls[i]出現的所有位置。
示例:輸入:
big = "mississippi"
smalls = ["is","ppi","hi","sis","i","ssippi"]
輸出: [[1,4],[8],,[3],[1,4,7,10],[5]]
0 <= len(big) <= 1000
0 <= len(smalls[i]) <= 1000
smalls的總字元數不會超過 100000。
你可以認為smalls中沒有重複字串。
所有出現的字元均為英文小寫字母。
一、蠻力法
class solution:
def multisearch(self, big: str, smalls: list[str]) -> list[list[int]]:
res =
for small in smalls:
indices =
tlen = len(small)
if tlen > 0:
for i in range(len(big)-tlen+1):
if big[i:i+tlen] == small:
return res
二、tier字典樹
class node(object):
def __init__(self, idx = none):
self.dic = {}
self.word_end = 0
#self.word_idx = idx
class trie(object):
def __init__(self):
self.root = {}
def insert_word(self, word, idx):
if word == '':
return
cur_dic = self.root
for char in word:
cur_dic.setdefault(char, node(idx))
ob = cur_dic[char]
cur_dic = ob.dic
ob.word_end = 1
ob.word_idx = idx
class solution:
def multisearch(self, big: str, smalls: list[str]) -> list[list[int]]:
trie = trie()
for idx, word in enumerate(smalls):
trie.insert_word(word, idx)
ans = [ for _ in range(len(smalls))]
for i in range(len(big)):
cur = trie.root
for j in range(i, len(big)):
if big[j] in cur:
ob = cur[big[j]]
_end = ob.word_end
cur = ob.dic
if _end:
else:
break
return ans
leetcode多次搜尋
1.字典樹 對small建trie樹,其中每個樹節點的isword記錄對於的其在smalls中的陣列下標 對字串big,遍歷其所有字尾,對於從i big.size 1的字尾,設為prefix,在trie樹中進行查詢,遍歷prefix,當出現乙個字元的isword 1時,表示從prefix 0 pre...
雜湊搜尋(多次探測,雜湊桶)
為什麼提出雜湊?順序搜尋和二叉樹搜尋中,元素儲存位置和元素關鍵碼之間沒有聯絡。因此在查詢乙個資料時,必須經過關鍵碼的多次比較,搜尋效率取決於比較次數。而乙個理想的搜尋是不經過比較,直接拿出資料,建立關鍵碼和儲存位置的關係。雜湊衝突的產生與解決 不同的關鍵碼通過相同的雜湊函式計算出相同的位址,產生衝突...
面試題17 17 多次搜尋
給定乙個較長字串big和乙個包含較短字串的陣列smalls,設計乙個方法,根據smalls中的每乙個較短字串,對big進行搜尋。輸出smalls中的字串在big裡出現的所有位置positions,其中positions i 為smalls i 出現的所有位置 輸入 big mississippi s...