題目
Example:
Input: s = "cbaebabacd", p = "abc" Output: [0,6] Explanation: The substring with start index = 0 is "cba", which is an anagram of "abc". The substring with start index = 6 is "bac", which is an anagram of "abc".
思路
用兩個指標當作 window 的 left 跟 right,再搭配一個 hash table 來紀錄
以下為操作步驟:
▼ right 指標開始動作,讀取 c 把 dict[c] 減去 1
dict[c] >= 0 所以 pcount 要減 1
pcount 為目前暫存的 anagrams 未使用的個數,亦即 pcount 為 0 時,就是找到答案
▼ 已讀取 b 把 dict[b] 減去 1
dict[b] >= 0 所以 pcount 要減 1
▼ 已讀取 a 把 dict[a] 減去 1
dict[a] >= 0 所以 pcount 要減 1
當 pcount 為 0 -> 找到 anagrams !
▼ 已讀取 e 把 dict[e] 減去 1
判斷 dict[e] < 0 ,開始執行 window 縮小,透過操作 left 指標直到與 right 一樣為止
dict[c] += 1
判斷 dict[c] > 0 所以 pcount += 1
dict[b] += 1
判斷 dict[b] > 0 所以 pcount += 1
dict[a] += 1
判斷 dict[a] > 0 所以 pcount += 1
dict[e] += 1
判斷 dict[e] > 0 不成立 (dict[e] 為 0), 離開 while loop
▼ 已讀取 b 把 dict[b] 減去 1
dict[b] >= 0 所以 pcount 要減 1
▼ 已讀取 a 把 dict[b] 減去 1
dict[a] >= 0 所以 pcount 要減 1
▼ 已讀取 b 把 dict[b] 減去 1
因為 dict[b] < 0 開始 window shrink,操作 left 指標
dict[b] += 1,可以想成把待完成步數還回去 dict
▼ 已讀取 a 把 dict[a] 減去 1
因為 dict[a] < 0 開始 window shrink,操作 left 指標
dict[a] += 1,可以想成把待完成步數還回去 dict
▼ 已讀取 c 把 dict[c] 減去 1
因為 dict[c] >= 0 所以 pcount -= 1
當 pcount 為 0 -> 找到 anagrams !
▼ 已讀取 d 把 dict[d] 減去 1
因為 dict[c] < 0 開始 window shrink 操作 left
dict[b] += 1,因為 dict[b] > 0 所以 pcount += 1
dict[a] += 1,因為 dict[a] > 0 所以 pcount += 1
dict[c] += 1,因為 dict[c] > 0 所以 pcount += 1
當最後 right 指標超過 s 本身長度,就結束