leetcode438——找到字符串中所有字母异位词——java实现

题目要求:
leetcode438——找到字符串中所有字母异位词——java实现_第1张图片
leetcode438——找到字符串中所有字母异位词——java实现_第2张图片

分析1:
本来是用暴力法解决的,但是超时,那只能另辟蹊径了。
这里利用滑动窗口的方法来做,先初始化两个指针left和right,它们均为0.
然后固定left,滑动right,再设置一个计数器count来计数,当两个map相同且count的值与p.length()相等时,就将left给放入到list中。

讲得不太清楚,大致这么个思路,代码中思路很清晰,但是我这个代码性能不太好,也懒得看别人的了。

具体代码如下:

class Solution {
    public List findAnagrams(String s, String p) {
        if(s == null || p == null || s.length() == 0 || p.length() == 0 || s.length() < p.length())
            return new ArrayList<>();
        Map map = new HashMap<>();
        Map map2 = new HashMap<>();
        
        for(int i = 0; i < p.length(); i ++) {
            char c = p.charAt(i);
            if(!map.containsKey(c)) {
                map.put(c, 1);
            } else {
                map.put(c, map.get(c) + 1);
            }
        }
        int left = 0, right = 0, count = 0;
        List list = new ArrayList<>();
        while(right < s.length()) {
            char c = s.charAt(right);
            if(!map.containsKey(c)) {
                right ++;
                left = right;
                count = 0;
                map2.clear();
            } else {
                if(count >= p.length()) {
                    map2.put(s.charAt(left), map2.get(s.charAt(left)) - 1);
                    left ++;
                } else {
                    count ++;
                }
                    
                if(!map2.containsKey(c)) {
                    map2.put(c, 1);
                } else {
                    map2.put(c, map2.get(c) + 1);
                }
                    
                if(count == p.length() && map2.equals(map)) {
                    list.add(left);
                }
                right ++;
            }
        }
        return list;
    }
}

加更:
做了leetcode76——最小覆盖子串——java实现之后,有了新的想法。用滑动窗口来做,把leetcode 76的代码稍微改一下就好了。

具体代码如下:

class Solution {
    public List findAnagrams(String s, String p) {
        Map map = new HashMap<>();
        List list = new ArrayList<>();
        for(int i = 0; i < p.length(); i ++) {
            char key = p.charAt(i);
            if(!map.containsKey(key)) {
                map.put(key, 1);
            } else {
                map.put(key, map.get(key) + 1);
            }
        }
        int left = 0, count = p.length(), size = p.length();
        for(int right = 0; right < s.length(); right ++) {
            char c = s.charAt(right);
            if(map.containsKey(c)) {
                map.put(c, map.get(c) - 1);
                if(map.get(c) >= 0) {
                    count --;
                }
            }
            while(count == 0) {
                if(right - left + 1 == p.length()) {
                    list.add(left);
                }
                char c2 = s.charAt(left);
                if(map.containsKey(c2)) {
                    map.put(c2, map.get(c2) + 1);
                    if(map.get(c2) > 0) {
                        count ++;
                    }
                }
                left ++;
            }
        }
        return list;
    }
}

你可能感兴趣的:(leecode)