串聯所有單詞的子串

2021-10-02 13:47:52 字數 2209 閱讀 9613

給定乙個字串 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」]

輸出:

該演算法的難點是不需要考慮 words 中單詞串聯的順序。而利用 hashmap 可以解決這個問題。

方法一:

我們可以借助兩個 hashmap 來實現。map1 用來儲存 words 中的單詞及其出現次數(key 表示單詞,value 表示出現次數)。map2用來儲存子串**現的單詞,若子串中的單詞在 words 中,將該單詞存入map2,比較map2中單詞出現的次數是否大於map1,若大於,就代表該子串不是我們要找的,接著判斷下乙個子串;若不大於,繼續判斷下乙個單詞。子串掃瞄結束,如果子串的全部單詞都符合,那麼該子串就是我們找的其中乙個。

方法二:

方法一每次只能移動乙個字元,時間效率較低。我們可以一次移動乙個單詞。這樣只需要進行 words[0].length() 次大迴圈。

迴圈時,主要有以下三種情況:

情況一:當子串完全匹配,需要移動到下乙個子串的時候。當此情況發生時,我們並不需要對下乙個子串重新進行判斷,因為判斷上乙個子串時,我們已經將下乙個子串的前 n - 1 個進行了判斷(n 表示 words 中單詞的個數),因此,只需要判斷下乙個子串的最後乙個單詞是否能和前面的單詞組成乙個符合要求的子串。

情況三:判斷過程中,出現的是符合的單詞,但是次數超了。此情況發生時,我們需要將超過次數的單詞「刪掉」,需要注意的是,我們不能直接刪掉,而是從子串開始的位置往後依次刪掉單詞,直到該單詞的次數不大於 map1 中的次數。

方法一:

class

solution

for(

int i =

0; i <= s.

length()

-wordcount*wordleng; i++)}

else

num++;}

if(num == wordcount)

}return result;

}}

方法二:

class

solution

int wordlen = words[0]

.length()

; hashmap

allwords =

newhashmap

();for

(string w : words)

//將所有移動分成 wordlen 類情況

for(

int j =

0; j < wordlen; j++

) num = num - removenum +1;

//加 1 是因為我們把當前單詞加入到了 hashmap 2 中

i = i +

(removenum -1)

* wordlen;

//這裡依舊是考慮到了最外層的 for 迴圈,看情況二的解釋

break;}

//出現情況二,遇到了不匹配的單詞,直接將 i 移動到該單詞的後邊(但其實這裡

//只是移動到了出現問題單詞的地方,因為最外層有 for 迴圈, i 還會移動乙個單詞

//然後剛好就移動到了單詞後邊)

}else

num++;}

if(num == wordnum)}}

return res;

}}

演算法 串聯所有單詞的子串

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

Leetcode初學 串聯所有單詞的子串

我認為這道題要做出來是不難的,主要是怎麼使他的效率變高 可惜我僅僅只是將這道題做出來,深感慚愧 我的思路可以算是滑動窗體吧 因為words中的每個單詞的長度相同,所以我們已知這個長度 以這個長度作為我們窗體的長度,在s中尋找是否有在words中存在的單詞 有的話,刪除words中存在的這個單詞,繼續...

演算法題 串聯所有單詞的子串

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