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

2021-10-03 14:52:55 字數 1608 閱讀 5515

給定乙個字串 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」 的字母異位詞。

滑動視窗演算法。

左右指標,初始化都為0,把[left,right]當成乙個視窗;

不斷增大right,直到視窗內的子串符合要求;

不斷增大left,縮小視窗直到視窗內子串不符合要求,在縮小left時記錄結果;

直到right到達字串串尾。

對於如何判斷是否符合要求,建立兩個雜湊表,乙個needs記錄pattern子串中字元出現次數,乙個windows記錄當前視窗子串中字元出現次數。用乙個match記錄符合規則的字元數。

當match等於needs的長度時,表明滿足條件,開始縮小視窗。每次縮小時,都要再次判斷條件,更新match。

public

static list

findanagrams

(string s, string p)

int left =

0, right =

0, match =0;

mapwindows =

newhashmap

<

>()

; map

needs =

newhashmap

<

>()

;//子串可能出現多次

for(

char c : p.

tochararray()

)char

chars = s.

tochararray()

;while

(right < chars.length)

} right++

;//視窗已經符合要求

while

(match == needs.

size()

)//存完就向右移動left

//先檢查left位置上的字元是不是要的字元

char c2 = chars[left];if

(needs.

containskey

(c2)

)//tmp為0就刪掉字元

if(tmp ==0)

else

} left++;}

}return list;

}

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