leetcode 30 串聯所有單詞的子串

2021-09-29 07:08:39 字數 1464 閱讀 7992

### 題目

給定乙個字串 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 顯然從每個位置開始都要匹配...