給定乙個字串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯形成的子串的起始位置。
注意子串要與 words 中的單詞完全匹配,中間不能有其他字元,但不需要考慮 words 中單詞串聯的順序。
示例 1:
輸入:s = 「barfoothefoobarman」,
words = [「foo」,「bar」]
輸出:[0,9]
解釋:從索引 0 和 9 開始的子串分別是 「barfoor」 和 「foobar」 。
輸出的順序不重要, [9,0] 也是有效答案。
示例 2:
輸入:s = 「wordgoodgoodgoodbestword」,
words = [「word」,「good」,「best」,「word」]
輸出:類似尺取法,假設word單詞長度為s 我們就每s段分成乙個單詞,每次分的第一單詞頭為1到s-1,這樣,我們就取到了所有單詞,之後map(dict)記錄下單詞出現數量之後尺取知道tmpdic==dic就為其中乙個答案
class
solution
:def
findsubstring
(self, s:
str, words: list[
str])-
> list[
int]:if
len(words)==0
:return
l_w=
len(words[0]
) l_s=
len(s)
dic=
tmpdic=
ans=
num=
len(words)
for word in words:
if word in dic:
dic[word]+=1
else
: dic[word]=1
for i in
range
(l_w)
: tmpdic.clear(
) l,r=i,i
tmpnum=
0print
(i)while
(i+l_w<=l_s and r+l_w<=l_s)
:if s[r:r+l_w]
notin tmpdic:
tmpdic[s[r:r+l_w]]=
1else
: tmpdic[s[r:r+l_w]]+=
1 tmpnum+=
1if s[r:r+l_w]
notin dic:
tmpnum=
0 tmpdic.clear(
) l=r+l_w
else
:#print(dic,tmpdic,num,tmpnum)
#print(l,r)
if tmpdic[s[r:r+l_w]
]== dic[s[r:r+l_w]
]and tmpnum==num:
#print("yes")
tmpdic[s[l:l+l_w]]-=
1 l=l+l_w
tmpnum-=
1elif tmpdic[s[r:r+l_w]
]< dic[s[r:r+l_w]]:
pass
else
:while
(tmpdic[s[r:r+l_w]
]>dic[s[r:r+l_w]])
: tmpdic[s[l:l+l_w]]-=
1 l+=l_w
tmpnum-=
1if tmpdic[s[r:r+l_w]
]== dic[s[r:r+l_w]
]and tmpnum==num:
print
("yes"
) tmpdic[s[l:l+l_w]]-=
1 l=l+l_w
tmpnum-=
1 r=r+l_w
return ans
力扣leetcode30 串聯所有單詞的子串
和 詳細通俗的思路分析,多解法 解法相同,該文章已經寫得很清晰了,就不再贅述,但是這個演算法處理了很多不必要的位置。因為在最終匹配的解裡面一定含有words 0 那麼先用o n 時間 可以用kmp 找到所有的可能位置,然後對該位置使用滑動視窗即可,耗時為鏈結中演算法的1 4左右,儘管在leetcod...
leetcode 30 串聯所有單詞的子串
leetcode題目鏈結 題目要求 找出 由words陣列組成的字串 每乙個元素word等長 在字元轉s中的位置 陣列words生成的字典dic2 遍歷字串,從頭開始判斷長度為lenwords的字串 生成的字典dic1 如果dic1 與 dic2 相同,說明找到 def findsubstring ...
leetcode 30 串聯所有單詞的子串
給定乙個字串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯形成的子串的起始位置。注意子串要與 words 中的單詞完全匹配,中間不能有其他字元,但不需要考慮 words 中單詞串聯的順序。示例 1 輸入 s barfoothefoobarman words...