首页 > 其他 > 详细

滑动窗口 字符串子串

时间:2021-04-11 21:29:52      阅读:17      评论:0      收藏:0      [点我收藏+]

3. 无重复字符的最长子串
技术分享图片

76. 最小覆盖子串
技术分享图片

567. 字符串的排列
技术分享图片




3. 无重复字符的最长子串
技术分享图片

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Map<Character, Integer> window = new HashMap<>();
        int left = 0;
        int right = 0;
        int result = 0;
        // for(char c : s.toCharArray()) {
        //     window.put(c, window.getOrDefault(c, 0) + 1);
        // }
        while(right < s.length()) {
            char c = s.charAt(right);
            right++;
            window.put(c, window.getOrDefault(c, 0) + 1);
            while(window.get(c) > 1) {
                char d = s.charAt(left);
                left++;
                window.put(d, window.getOrDefault(d, 0) - 1);
            }
            result = Math.max(right - left, result);
        }
        return result;
    }
}

76. 最小覆盖子串

技术分享图片

class Solution {
    public String minWindow(String s, String t) {
        HashMap<Character, Integer> need = new HashMap<Character, Integer>();
        HashMap<Character, Integer> window = new HashMap<>();
        for (char c :  t.toCharArray()) need.put(c, need.getOrDefault(c, 0) + 1);

        int left = 0, right = 0;
        int valid = 0;
        // 记录最小覆盖字串的起始索引及长度
        int start = 0, len = Integer.MAX_VALUE;
        while (right < s.length()) {
            char c = s.charAt(right);
            right++;
            // 判断取出的字符是否在字串中
            if (need.containsKey(c)) {
                window.put(c, window.getOrDefault(c,0) + 1);
                if (window.get(c).equals(need.get(c))) {
                    valid++;
                }
            }

            // 判断是否需要收缩(已经找到合适的覆盖串)
            while (valid == need.size()) {
                if (right - left < len) {
                    start = left;
                    len = right - left;
                }

                char c1 = s.charAt(left);
                left++;
                if (need.containsKey(c1)) {
                    if (window.get(c1).equals(need.get(c1))) {
                        valid--;
                    }
                     window.put(c1, window.getOrDefault(c1, 0) - 1);
                }

            }
        }

        return len == Integer.MAX_VALUE ? "" : s.substring(start, start + len);
    }
}

567. 字符串的排列
技术分享图片

class Solution {
    public boolean checkInclusion(String s1, String s2) {

        HashMap<Character,Integer> window = new HashMap<>();
        HashMap<Character,Integer> need = new HashMap<>();
        int left,right;
        left=right=0;
        int valid=0;

        for(char a:s1.toCharArray()){
            need.put(a,need.getOrDefault(a,0)+1);
        }
        while(right<s2.length()){
            char c=s2.charAt(right);
            right++;
            if(need.containsKey(c)){
                window.put(c,window.getOrDefault(c,0)+1);
                if(need.get(c).equals(window.get(c))){
                    valid++;
                }
            }

            while(right-left==s1.length()){
                if(valid==need.size()){
                    return true;
                }
                char c1=s2.charAt(left);
                left++;
                if(need.containsKey(c1)){
                    if(need.get(c1).equals(window.get(c1))){
                        valid--;
                    }
                    window.put(c1,window.get(c1)-1);
                }
            }
        }
        return false;
    }
}

滑动窗口 字符串子串

原文:https://www.cnblogs.com/ming-michelle/p/14645247.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!