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

  • 相关阅读:
    调用Android自带日历功能
    android使用全局变量传递数据
    安卓高手之路之java层Binder
    无刷新实时获得数据
    Android画图之抗锯齿
    android 定时器的实现
    将apk文件添加到Android模拟器(AVD)中运行
    Android 屏幕自适应方向尺寸
    经常用得到的安卓数据库基类
    android系统特效详解和修改方法
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8711232.html
Copyright © 2011-2022 走看看