2016年10月27日星期四

438. Find All Anagrams in a String



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;  
   }  

没有评论:

发表评论