leetcode438 找到字符串中所有字母异位词 &通用滑动窗口解法

leetcode438 找到字符串中所有字母异位词

题目详情

leetcode438 找到字符串中所有字母异位词 &通用滑动窗口解法_第1张图片leetcode438 找到字符串中所有字母异位词 &通用滑动窗口解法_第2张图片

本题解法

public class Solution {
    public List<Integer> findAnagrams(String s, String p){
        if(s.length() < p.length())
            return new ArrayList<Integer>();
        List<Integer> res = new ArrayList<Integer>();
        Map<Character, Integer> pMap = new HashMap<Character, Integer>();
        for(char c : p.toCharArray()){
            if(!pMap.containsKey(c))
                pMap.put(c, 0);
            pMap.put(c, pMap.get(c) + 1);
        }

        Map<Character, Integer> sMap = new HashMap<Character, Integer>();
        for(int i = 0; i < p.length(); i ++){
            char c = s.charAt(i);
            if(pMap.containsKey(c)){
                if(!sMap.containsKey(c))
                    sMap.put(c, 0);
                sMap.put(c, sMap.get(c) + 1);
            }
        }
        int left = 0;
        int right = p.length() - 1;
        while(right < s.length()){
           if(check(sMap, pMap)){
                res.add(left);
            }
            char cl = s.charAt(left);
            if(pMap.containsKey(cl))
                sMap.put(cl, sMap.get(cl) - 1);
            left ++;
            right ++;
            if(right >= s.length())
                break;
            char cr = s.charAt(right);

            if(pMap.containsKey(cr)) {
                if (!sMap.containsKey(cr))
                    sMap.put(cr, 0);
                sMap.put(cr, sMap.get(cr) + 1);
            }
        }
        return res;
    }

    private boolean check(Map<Character, Integer> sMap, Map<Character, Integer> pMap){
        return sMap.equals(pMap);
    }
}

通用滑动窗口解法

leetcode438 找到字符串中所有字母异位词 &通用滑动窗口解法_第3张图片leetcode438 找到字符串中所有字母异位词 &通用滑动窗口解法_第4张图片leetcode438 找到字符串中所有字母异位词 &通用滑动窗口解法_第5张图片leetcode438 找到字符串中所有字母异位词 &通用滑动窗口解法_第6张图片leetcode438 找到字符串中所有字母异位词 &通用滑动窗口解法_第7张图片

string s, t;
// 在 s 中寻找 t 的「最小覆盖子串」
int left = 0, right = 0;
string res = s;

while(right < s.size()) {
    window.add(s[right]);
    right++;
    // 如果符合要求,移动 left 缩小窗口
    while (window 符合要求) {
        // 如果这个窗口的子串更短,则更新 res
        res = minLen(res, window);
        window.remove(s[left]);
        left++;
    }
}
return res;

你可能感兴趣的:(leetcode,Java)