[Leetcode] Find All Anagrams in a String – Sliding Window 應用

用兩個指標當作 window 的 left 跟 right,再搭配一個 hash table 來紀錄

題目

Find All Anagrams in a String

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 本身長度,就結束

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *