438 找到字串中所有字母異位詞

2021-10-07 21:32:40 字數 1267 閱讀 7689

題目描述:

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