題目描述:
給定乙個字串 s 和乙個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。
字串只包含小寫英文本母,並且字串 s 和 p 的長度都不超過 20100。
說明:
字母異位詞指字母相同,但排列不同的字串。
不考慮答案輸出的順序。
示例 1:
輸入:s: 「cbaebabacd」 p: 「abc」
輸出:[0, 6]
解釋:起始索引等於 0 的子串是 「cba」, 它是 「abc」 的字母異位詞。
起始索引等於 6 的子串是 「bac」, 它是 「abc」 的字母異位詞。
示例 2:
輸入:s: 「abab」 p: 「ab」
輸出:[0, 1, 2]
解釋:起始索引等於 0 的子串是 「ab」, 它是 「ab」 的字母異位詞。
起始索引等於 1 的子串是 「ba」, 它是 「ab」 的字母異位詞。
起始索引等於 2 的子串是 「ab」, 它是 「ab」 的字母異位詞。
方法1:滑動視窗
主要思路:
(1)本體和567 字串排列幾乎是一樣的題,本題中的異位詞本質就是排列,在567中只需要判斷排列是否存在,本題需要找到所有可能的排列的位置,本質上是一樣的,只不過在567中,找到乙個全排列後直接返回結果,在本題中只需要將當前位置壓入到結果中,找到所有的可能的位置;
class
solution
;int win[
256]=;
int size_p_single=0;
//統計字串p中不重複的字元的個數
//統計p中的字串
for(
char ch:p)
//儲存所有的異位詞(全排列)的位置
vector<
int> res;
//視窗的輔助變數
int left=0;
int right=0;
int valid=0;
//視窗右側邊界越界作為終止條件
while
(rightsize()
)//若當前視窗內有全部的 p 中的字元
while
(valid==size_p_single)}}
return res;}}
;
438 找到字串中所有字母異位詞
給定乙個字串 s 和乙個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。字串只包含小寫英文本母,並且字串 s 和 p 的長度都不超過 20100。說明 字母異位詞指字母相同,但排列不同的字串。不考慮答案輸出的順序。示例 1 輸入 s cbaebabacd p abc...
438 找到字串中所有字母異位詞
給定乙個字串 s 和乙個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。字串只包含小寫英文本母,並且字串 s 和 p 的長度都不超過 20100。說明 字母異位詞指字母相同,但排列不同的字串。不考慮答案輸出的順序。示例 1 輸入 s cbaebabacd p abc...
438 找到字串中所有字母異位詞
給定乙個字串 s 和乙個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。字串只包含小寫英文本母,並且字串 s 和 p 的長度都不超過 20100。說明 字母異位詞指字母相同,但排列不同的字串。不考慮答案輸出的順序。示例 1 輸入 s cbaebabacd p abc...