美文网首页
438. Find All Anagrams in a Stri

438. Find All Anagrams in a Stri

作者: liuhaohaohao | 来源:发表于2018-04-08 18:18 被阅读0次

    滑动窗口思想,就是利用双指针技巧,以及map这一数据结构,维护一个不断扩展、伸缩的窗口,在窗口内探测记录我们感兴趣的结果。

    public class Solution {
        public List<Integer> slidingWindowTemplate(String s, String t) {
            //init a collection or int value to save the result according the question.
            List<Integer> result = new LinkedList<>();
            if(t.length()> s.length()) return result;
            
            //create a hashmap to save the Characters of the target substring.
            //(K, V) = (Character, Frequence of the Characters)
            Map<Character, Integer> map = new HashMap<>();
            for(char c : t.toCharArray()){
                map.put(c, map.getOrDefault(c, 0) + 1);
            }
            //maintain a counter to check whether match the target string.
            int counter = map.size();//must be the map size, NOT the string size because the char may be duplicate.
            
            //Two Pointers: begin - left pointer of the window; end - right pointer of the window
            int begin = 0, end = 0;
            
            //the length of the substring which match the target string.
            int len = Integer.MAX_VALUE; 
            
            //loop at the begining of the source string
            while(end < s.length()){
                
                char c = s.charAt(end);//get a character
                
                if( map.containsKey(c) ){
                    map.put(c, map.get(c)-1);// plus or minus one
                    if(map.get(c) == 0) counter--;//modify the counter according the requirement(different condition).
                }
                end++;
                
                //increase begin pointer to make it invalid/valid again
                while(counter == 0 /* counter condition. different question may have different condition */){
                    
                    char tempc = s.charAt(begin);//***be careful here: choose the char at begin pointer, NOT the end pointer
                    if(map.containsKey(tempc)){
                        map.put(tempc, map.get(tempc) + 1);//plus or minus one
                        if(map.get(tempc) > 0) counter++;//modify the counter according the requirement(different condition).
                    }
                    
                    /* save / update(min/max) the result if find a target*/
                    // result collections or result int value
                    
                    begin++;
                }
            }
            return result;
        }
    }
    

    Similar Questions:
    https://leetcode.com/problems/minimum-window-substring/ https://leetcode.com/problems/longest-substring-without-repeating-characters/ https://leetcode.com/problems/substring-with-concatenation-of-all-words/ https://leetcode.com/problems/longest-substring-with-at-most-two-distinct-characters/ https://leetcode.com/problems/find-all-anagrams-in-a-string/

    相关文章

      网友评论

          本文标题:438. Find All Anagrams in a Stri

          本文链接:https://www.haomeiwen.com/subject/oaemhftx.html