题解 | #最小覆盖子串#

最小覆盖子串

http://www.nowcoder.com/practice/c466d480d20c4c7c9d322d12ca7955ac

  • 使用双指针
  • 满足覆盖条件时右移左指针缩小窗口
  • 不满足覆盖条件时右移右指针扩大窗口
import java.util.*;
public class Solution {
    /**
     * 
     * @param S string字符串 
     * @param T string字符串 
     * @return string字符串
     */
    public String minWindow (String S, String T) {
        // write code here
        int length = Integer.MAX_VALUE;
        String ans = "";
        Map<Character, Integer> map = new HashMap<>();
        Map<Character, Integer> readyMap = new HashMap<>();
        Set<Character> set = new HashSet<>();
        Set<Character> readySet = new HashSet<>();
        for (int i = 0; i < T.length(); i++) {
            int oldValue = map.getOrDefault(T.charAt(i), 0);
            map.put(T.charAt(i), oldValue + 1);
            readyMap.put(T.charAt(i), 0);
            set.add(T.charAt(i));
        }
        int left = 0;
        int right = 0;
        while (right < S.length()) {
            if (readySet.size() < set.size()) {
                Character c = S.charAt(right);
                if (set.contains(c)) {
                    readyMap.put(c, readyMap.get(c) + 1);
                    if (readyMap.get(c) >= map.get(c)) {
                        readySet.add(c);
                    }
                }
                right++;
            }else {
                if (right - left < length) {
                    ans = S.substring(left, right);
                    length = ans.length();
                }
                Character c = S.charAt(left);
                if (set.contains(c)) {
                    readyMap.put(c, readyMap.get(c) - 1);
                    if (readyMap.get(c) < map.get(c) && readySet.contains(c)) {
                        readySet.remove(c);
                    }
                }
                left ++;
            }
        }
        while (readySet.size() == set.size()) {
            if (right - left < length) {
                ans = S.substring(left, right);
                length = ans.length();
            }
            Character c = S.charAt(left);
            if (set.contains(c)) {
                readyMap.put(c, readyMap.get(c) - 1);
                if (readyMap.get(c) < map.get(c) && readySet.contains(c)) {
                    readySet.remove(c);
                }
            }
            left ++;
        }
        return ans;
    }
}
全部评论

相关推荐

拒绝无效加班的小师弟很中意你:求职意向没有,年龄、课程冗余信息可以删掉,需要提升项目经历。排版需要修改。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
439972次浏览 4484人参与
# 春招别灰心,我们一人来一句鼓励 #
41352次浏览 523人参与
# 北方华创开奖 #
107240次浏览 599人参与
# 地方国企笔面经互助 #
7914次浏览 18人参与
# 虾皮求职进展汇总 #
113497次浏览 880人参与
# 实习,投递多份简历没人回复怎么办 #
2453683次浏览 34846人参与
# 阿里云管培生offer #
119640次浏览 2219人参与
# 实习必须要去大厂吗? #
55552次浏览 959人参与
# 同bg的你秋招战况如何? #
75178次浏览 548人参与
# 提前批简历挂麻了怎么办 #
149763次浏览 1976人参与
# 投递实习岗位前的准备 #
1195578次浏览 18546人参与
# 你投递的公司有几家约面了? #
33166次浏览 188人参与
# 双非本科求职如何逆袭 #
661770次浏览 7394人参与
# 机械人春招想让哪家公司来捞你? #
157585次浏览 2267人参与
# 如果公司给你放一天假,你会怎么度过? #
4714次浏览 53人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11214次浏览 253人参与
# 发工资后,你做的第一件事是什么 #
12359次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35521次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20068次浏览 240人参与
# 实习想申请秋招offer,能不能argue薪资 #
39205次浏览 314人参与
# 我的上岸简历长这样 #
451863次浏览 8087人参与
# 非技术岗是怎么找实习的 #
155831次浏览 2120人参与
牛客网
牛客企业服务