438.Find All Anagrams in a String

https://leetcode.com/problems/find-all-anagrams-in-a-string/discuss/92015/

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> ans = new ArrayList<>();
        if(s == null || s.length() == 0 || p == null || p.length() == 0){
            return ans;
        }
        int[] hash = new int[26];
        //record each character in p to hash
        for(char c : p.toCharArray()){
            hash[c - 'a']++;
        }

        //two points, initialize count to p's length
        int left = 0, right = 0, count = p.length();
        while(right < s.length()){

            //move right everytime, if the character exists in p's hash, decrease the count
            //current hash value >= 1 means the character is existing in p
            if(hash[s.charAt(right) - 'a'] >= 1){
                count--;
            }
            hash[s.charAt(right) - 'a']--;
            right++;

            //when the count is down to 0, means we found the right anagram
            //then add window's left to result list
            if(count == 0){
                ans.add(left);
            }

            //if we find the window's size equals to p, then we have to move left (narrow the window) to find the new match window
            //++ to reset the hash because we kicked out the left
            //only increase the count if the character is in p
            //the count >= 0 indicate it was original in the hash, cuz it won't go below 0
            if(right - left == p.length()){
                if(hash[s.charAt(left) - 'a'] >= 0){
                    count++;
                }
                hash[s.charAt(left) - 'a']++;
                left++;
            }
        }
        return ans;
    }
}

results matching ""

    No results matching ""