To find all anagrams of string 'p' in string 's', we use a sliding window approach with two
frequency hashes. We first
create
a
frequency hash
for
'p'
.
Then, we
slide a window
of size
p.size()
over
's'
, maintaining
a frequency
hash for the current window. If the frequency hash of the window
matches
the frequency
hash of
'p'
, we record
the starting index of the window. This ensures we efficiently find all anagram's starting indices.
class Solution { public List<Integer> findAnagrams(String s, String p) { List<Integer> list = new ArrayList<>(); if (p.length() > s.length()) return list; int[] sHash = new int[26]; int[] pHash = new int[26]; for (int i = 0; i < p.length(); i++) { char ch = p.charAt(i); pHash[ch - 'a']++; } int start = 0; int end = 0; while (end < p.length()) { char ch = s.charAt(end); sHash[ch - 'a']++; end++; } if (Arrays.equals(sHash, pHash)) list.add(0); while (end < s.length()) { char ch1 = s.charAt(start); char ch2 = s.charAt(end); sHash[ch1 - 'a']--; sHash[ch2 - 'a']++; end++; start++; if (Arrays.equals(sHash, pHash)) list.add(start); } return list; } }
The algorithm iterates through s
once, making it
linear
in time complexity.
The algorithm uses fixed-size frequency hashes, ensuring constant space usage.