python 多次搜尋

2021-10-11 04:17:41 字數 1786 閱讀 1028

給定乙個較長字串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...