Leetcode第三十題 串聯所有單詞的子串

2021-10-08 00:28:05 字數 2593 閱讀 9634

題目:

給定乙個字串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯形成的子串的起始位置。

注意子串要與 words 中的單詞完全匹配,中間不能有其他字元,但不需要考慮 words 中單詞串聯的順序。

示例 1:

輸入:s = "barfoothefoobarman",

words = ["foo","bar"]

輸出:[0,9]

解釋:從索引 0 和 9 開始的子串分別是 "barfoo" 和 "foobar" 。

輸出的順序不重要, [9,0] 也是有效答案。

示例 2:

輸入:s = "wordgoodgoodgoodbestword",

words = ["word","good","best","word"]

輸出:個人思路:

只能想到暴力解法。。。

官方答案推薦:

①兩個hashmap,把乙個單詞作為乙個整體,逐一遍歷加進hashmap比較

②每次移動單詞長度來比較,同樣需要兩個hashmap(dictionary)並有二點優化:

1、有不存在的直接跳過這個不存在的單詞

2、有多餘的重複單詞,直接把指標跳到該單詞後面

python**:

class solution:

def findsubstring(self, s: str, words: list[str]) -> list[int]:

result=

wordscount = len(words)

if wordscount==0:return

#長度統計

strlength = len(s)

wordslength = len(words[0])

wordstotallength = wordscount * wordslength

#構造words的dict

wordsdict = {}

for i in range(wordscount):

if words[i] not in wordsdict:

wordsdict[words[i]] = 0

wordsdict[words[i]] += 1

#主字串每次向前移動1個字母,當i為乙個單詞長度後,後面的就不用比了因為已經比較過了

for i in range(wordslength):

j = i

#當前相等的長度

curequallength = 0

#用於單詞數量的比較

curstrwordsdict = {}

while j <= strlength - wordslength:

curword = s[j:j+wordslength]

#不在提供的字典裡,則移動至下乙個單詞

if curword not in wordsdict:

curequallength = 0

curstrwordsdict.clear()

else:

#在字典裡,數量+1

if curword not in curstrwordsdict:

curstrwordsdict[curword] = 0

curstrwordsdict[curword] += 1

curequallength += wordslength

#數量多了,則將第乙個相同單詞之前的全部刪掉

if curstrwordsdict[curword] > wordsdict[curword]:

tempindex = j - curequallength + wordslength

tempword = s[tempindex:tempindex+wordslength]

while tempword != curword:

curstrwordsdict[tempword] -= 1

tempindex += wordslength

tempword = s[tempindex:tempindex+wordslength]

curequallength -= wordslength

curstrwordsdict[curword] -= 1

curequallength -= wordslength

#j向前移動乙個單詞的長度

j += wordslength

#相同,將索引加到結果集裡,將第乙個單詞的記錄刪掉

if curequallength == wordstotallength:

startindex = j-wordstotallength

curstrwordsdict[s[startindex:startindex+wordslength]] -= 1

curequallength -= wordslength

return result

反思:

按照官方答案的思路自己寫出來的**,感覺有點太冗長了但也不知道怎麼精簡。。。

LeetCode第三十題 Python實現

title leetcode no.30 categories tags 給定乙個字串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯形成的子串的起始位置。注意子串要與 words 中的單詞完全匹配,中間不能有其他字元,但不需要考慮 words 中單詞串聯的...

《劍指offer》第三十題(包含min函式的棧)

面試題30 包含min函式的棧 題目 定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的min 函式。在該棧中,呼叫min push及pop的時間複雜度都是o 1 include include include 定義乙個模板類 template class stackwithmin vir...

Android 第三十周

總結 asynctak 封裝了 thread 和 handler,所以可以在子執行緒中執行任務,在主線程中更新 ui 如果應用和主線程沒有互動,則應該使用 thread,而不是 asynctask 1.1 asynctask 的使用限制 1.asynctask 必須在主線程中載入,保證了 handl...