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