438. Find All Anagrams in a String
題目
給定一個字串 s
,找出所有的substring屬於另一個字串 p
的 anagram,回傳所有符合條件的index
- anagram即同分異構物,substring不限順序,與
p
含有一樣的字母與數量
限制
-
1 <= s.length, p.length <= 3 * 104
-
s
andp
consist of lowercase English letters.
思考一些test case
-
不會有空字串
-
s = “abc“, p = “abc“
⇒[0]
-
s = “abc“, p = “abcd”
⇒p
長度大於s
,無解 -
s = “abababababa”, p = “ab”
⇒ 每個長度為2的substring都是解 -
s = “abba”, p = “aab”
⇒ 重複元素只能用一次,abb
不算解答
解題思路
-
檢查是否為anagram,就在檢查每個
p.size()
的substring是否為anagram-
需要走過
s.size()
-p.size()
次搜尋 -
每次檢查需要
p.size()
-
-
當
s = “abcdcba“p = “abc”
-
[abc]dcba
-
a[bcd]cba
-
ab[cdc]ba
-
abc[dcb]a
-
abcd[cba]
-
-
由上列執行順序可觀察到檢查的範圍內每次會移除第一個,並加入下一個字母,只要記錄第window內每個字母的數量,每次移動window時只需要修改記數就能知道window內與p匹配的字母數量
-
只要比對目前 window 內匹配數是否與p相等就能知道是否為 anagram
-
為了處理重複字母的問題,用一個hash map來記錄p的每一個字母數量,與window內的數量相減,只要小於0表示該字母已經全部匹配到,匹配數就不應該增加,反之字母被移除出window時若該字母大於或等於0則表示匹配的字母被移除,匹配數須減一