438. Find All Anagrams in a String

一、题目

  1、审题 

  

  

 

  2、分析

    求出所有s子串的下标,从该下标开始的连续子字符串包含 p 中的所有字符(可以无序);

    以 List方式返回所有下标;

 

二、解答

  1、思路

    以滑动窗口的方式统计所有符合的子串!

    public List<Integer> findAnagrams(String s, String t) {
        ArrayList<Integer> result = new ArrayList<>();
        if(s.length() < t.length())
            return result;
        
        HashMap<Character, Integer> map = new HashMap<>();
        for(char c: t.toCharArray())
            map.put(c, map.getOrDefault(c, 0) + 1);
        
        int counter = map.size();
        
        int begin = 0, end = 0;
//        int head = 0;
//        int len = Integer.MAX_VALUE;
        while(end < s.length()) {
            char c = s.charAt(end);
            if( map.containsKey(c) ) {
                map.put(c, map.get(c) - 1);
                if(map.get(c) == 0)
                    counter--;
            }
            end++;
            
            while(counter == 0) {
                char tmpc = s.charAt(begin);
                if( map.containsKey(tmpc) ) {
                    map.put(tmpc, map.get(tmpc) + 1);
                    if(map.get(tmpc) > 0)
                        counter++;
                }
                //--------
                if(end - begin == t.length())
                    result.add(begin);
                //--------
                begin++;
            }
        }
        return result;
    }

 

posted @ 2019-07-16 20:28  skillking2  阅读(33)  评论(0编辑  收藏