題目:
給定乙個字串 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...