438. Find All Anagrams in a String

notice:

// array compare
if (Arrays.equals(map, cMap)) {


// map compare
if (map.equals(cMap)) {

T: O(n*26)
S: O(26)
class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> res = new ArrayList<>();
        
        Map<Character, Integer> map = new HashMap<>();
        for (char c : p.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        
        int winsize = p.length();
        int left = 0;
        Map<Character, Integer> cMap = new HashMap<>();
        for (int right = 0; right < s.length(); right++) {
            char c = s.charAt(right);
            cMap.put(c, cMap.getOrDefault(c, 0) + 1);
           
            if (right - left + 1 > winsize) {
                char lc = s.charAt(left);
                cMap.put(lc, cMap.getOrDefault(lc, 0) - 1);
                if (cMap.get(lc) == 0) {
                    cMap.remove(lc);
                }
                left++;
            }
            
            if (right - left + 1 == winsize) {
                if (map.equals(cMap)) {
                    res.add(left);
                }
            }
        }
        return res;
    }
}

/*
use sliding win with p's size

"cbaebabacd"
 [  ]
  [  ]
   [  ]

compare two hashmap each other is equal

T: O(n*26)
S: O(26)
*/

same to 76, 567

Last updated

Was this helpful?