zoukankan      html  css  js  c++  java
  • 076 Minimum Window Substring 最小窗口子字符串

    给定一个字符串 S 和一个字符串 T,找到 S 中的最小窗口,它将包含复杂度为 O(n) 的 T 中的所有字符。
    示例:
    S = "ADOBECODEBANC"
    T = "ABC"
    最小窗口是 "BANC".
    注意事项:
    如果 S 中没有覆盖 T 中所有字符的窗口,则返回空字符串 ""。
    如果有多个这样的窗口,你将会被保证在 S 中总是只有一个唯一的最小窗口。
    详见:https://leetcode.com/problems/minimum-window-substring/description/

    Java实现:

    class Solution {
        public String minWindow(String s, String t) {
            if (s == null || t == null || s.length() < t.length()){
                return "";
            }
            // HashMap的key为t中各个字符,value为对应字符个数
            Map<Character, Integer> map = new HashMap<Character, Integer>();
            for (char c : t.toCharArray()) {
                if (!map.containsKey(c)){
                    map.put(c, 0);
                }
                map.put(c, map.get(c) + 1);
            }
            // minLeft为最小窗口左下标,minLen为最小长度,count用来计数
            int minLeft = 0, minLen = s.length() + 1, count = 0;
            int left = 0;
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (map.containsKey(c)) {
                    // 如果map.get(c)说明t中还有字符没有包含,计数器+1
                    if (map.get(c) > 0){
                        count++;
                    }
                    map.put(c, map.get(c) - 1);
                }
                // 如果left到i中包含t中所有字符
                while (count == t.length()) {
                    if (i - left + 1 < minLen) {
                        minLeft = left;
                        minLen = i - left + 1;
                    }
                    c = s.charAt(left);
                    if (map.containsKey(c)) {
                        map.put(c, map.get(c) + 1);
                        if (map.get(c) > 0){
                            count--;
                        }
                    }
                    left++;
                }
            }
            if (minLen > s.length()){
                return "";
            }
     
            return s.substring(minLeft, minLeft + minLen);
        }
    }
    

    参考:https://www.nowcoder.com/questionTerminal/c466d480d20c4c7c9d322d12ca7955ac 

    详见:https://www.cnblogs.com/grandyang/p/4340948.html

  • 相关阅读:
    MongoDB对比关系型数据库
    Swagger 打开时自动折叠
    更改Linux定时任务crontab启动基目录
    linux系统/etc/init.d目录下的开机自启脚本
    vue 中新窗口打开vue页面 (this.$router.resolve)
    树莓派4B如何手动固定IP地址
    树莓派无显示器设置WiFi、开启ssh、开启VNC
    递归
    学习-HTML5
    只是为了表示我还有在敲代码
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8711232.html
Copyright © 2011-2022 走看看