Sliding window 解法!!
一开始很纠结合适移动start pointer
m:当前状态下还要找几个character才能构成p
看了discussion。发现了因为要match,window size 固定。
当end >= p.length()-1就移动start到下个位置,以保持window大小固定。
对于出了window内的character,我们还原它的count: count[s.charAt(start++)-'a']++
如果start原来那个位置是给string p做了贡献的话,m++
public List<Integer> findAnagrams(String s, String p) { List<Integer> ans = new ArrayList<>(); int n = s.length(),m=p.length(); int[] count = new int[26]; for(int i = 0; i < m; i++){ count[p.charAt(i)-'a']++; } for(int start = 0, end = 0; end< n; end++){ int idx = s.charAt(end)-'a'; if(count[idx]-- > 0) m --; if(m == 0) ans.add(start); //when the difference of left and end >= p.length() we move start pointer! //if this pointer was point to sth in map, we count++
if(end - start + 1== p.length() && count[s.charAt(start++)-'a']++>=0) m++;
} return ans; }
没有评论:
发表评论