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

2021-10-05 19:41:44 字數 1446 閱讀 2449

雜記所有題目源**:git位址

題目

給定乙個字串 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陣列長度為l,word單詞長度為wl,遍歷字串s, 下標記做i,

需要比對的單詞起始座標則為 [i, i+wl, i+2wl … i+(l-1)*wl]

如果i滿足條件,各個單詞的第k位之和一定相等

即:*words[0][k] + words[1][k] + … + words[l-1][k] == s[i + k] + s[i+wl + k] + … + s[i+(l-1)wl + k]

反之,若對於i,滿足後者條件的i則可能為正確結果,這個時候直接校驗即可。

總結:先找出符合特徵的下標,再對符合下標的結果進行校驗,完全符合則輸出。

class solution 

int wlen = words[0].length();

int wtotallen = words[0].length() * words.length;

int slen = s.length();

int flagarray = new int[wlen];

for (int i = 0; i < wlen; i++)

flagarray[i] = flag;

}bitset bs = new bitset(words.length);

for (int i = 0; i <= slen - wtotallen; i++)

if (sumflag != flagarray[j])

}if (j == wlen)

}if (n == words.length)

}if (bs.cardinality() == words.length) }}

return rs;

}}

複雜度計算 雜記

30 串聯所有單詞的子串 leetcode

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

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...