### 題目
給定乙個字串 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"]
輸出:### 思路
暴力法,利用兩個map,乙個用來儲存words中的所有單詞,並且記錄下一共有多少個單詞,然後第二個map在字串進行比對的時候使用,用來儲存比對了多少個單詞,當兩個map一樣的時候,說明比對結束。
舉例說明:
s = "wordgoodgoodgoodbestword",
words = ["word","good","best","word"]
首先利用m1儲存下words中的單詞以及個數,m1最後得到結果如下:
m1={"word"=2,"good"=1,"best"=1}
然後對於s從索引0開始進行遍歷,但是不用遍歷到j=s.size(),只用遍歷到(int)s.size()-l1*l2,l1為單詞個數,l2為單詞長度。
因為單詞的長度都是一樣的,所以每次都從s中直接擷取l2長度的字元作為乙個待匹配的單詞temp,匹配中只有三種情況會結束匹配:
1.匹配結束,l1個單詞都在這個字串中找到了
2.temp並不存在與words中,匹配失敗,這裡用m1.find(temp)==m1.end()表示未找到temp
3.匹配失敗,temp確實存在與words中,但是words中沒有這麼多個temp,這裡用m2[temp]>m1[temp]來表示。
對於s進行匹配,情況如下:
索引 匹配情況
0: 匹配到兩個good的時候停止,words中沒有兩個good
1: ordg不存在
2: rdgo不存在
3: dgoo不存在
4: 匹配到兩個good,停止
5: oodg不存在
6: odgo不存在
7: dgoo不存在
8: 匹配到兩個good,停止
到8就結束了,輸出結果.
### code
class solution
if(j==l1)//j剛好等於l1,說明每乙個都比對完成了。
res.push_back(i);
}return res;
}};
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...
LeetCode 30 串聯所有單詞的子串
題目鏈結 題解 開個字典樹記錄下所有的單詞。然後注意題目的已知條件 每個單詞的長度都是一樣的。這就說明不會出現某個字串是另外乙個字串的字首的情況 除非相同 所以可以貪心地匹配 遇到什麼字元就在字典樹裡面沿著邊從根往下走就好 假設給的單詞的個數為len.每個單詞的長度都是l 顯然從每個位置開始都要匹配...