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

trhflybingo發表於2020-11-30

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        char[] arrS = s.toCharArray();
        char[] arrP = p.toCharArray();
        
        // 接收最後返回的結果
        List<Integer> ans = new ArrayList<>();
        
        // 定義一個 needs 陣列來看 arrP 中包含元素的個數
        int[] needs = new int[26];
        // 定義一個 window 陣列來看滑動視窗中是否有 arrP 中的元素,並記錄出現的個數
        int[] window = new int[26]; 
        
        // 先將 arrP 中的元素儲存到 needs 陣列中
        for (int i = 0; i < arrP.length; i++) {
            needs[arrP[i] - 'a'] += 1;
        }
        
        // 定義滑動視窗的兩端
        int left = 0;
        int right = 0;
        
        // 右視窗開始不斷向右移動
        while (right < arrS.length) {
            int curR = arrS[right] - 'a';
            right++;
            // 將右視窗當前訪問到的元素 curR 個數加 1 
            window[curR] += 1;
            
            // 當 window 陣列中 curR 比 needs 陣列中對應元素的個數要多的時候就該移動左視窗指標 
            while (window[curR] > needs[curR]) {
                int curL = arrS[left] - 'a';
                left++;
                // 將左視窗當前訪問到的元素 curL 個數減 1 
                window[curL] -= 1;            
            }
            
            // 這裡將所有符合要求的左視窗索引放入到了接收結果的 List 中
            if (right - left == arrP.length) {
                ans.add(left);
            }
        }
        return ans;
    }
}
 

相關文章