zoukankan      html  css  js  c++  java
  • Leetcode 76. Minimum Window Substring

    Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).

    For example,
    S = "ADOBECODEBANC"
    T = "ABC"

    Minimum window is "BANC".

    Note:
    If there is no such window in S that covers all characters in T, return the empty string "".

    If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.

    我们最开始先扫描一遍T,把对应的字符及其出现的次数存到哈希表中。

    然后开始遍历S,遇到T中的字符,就把对应的哈希表中的value减一,直到包含了T中的所有的字符,纪录一个字串并更新最小字串值。

    将子窗口的左边界向右移,略掉不在T中的字符,如果某个在T中的字符出现的次数大于哈希表中的value,则也可以跳过该字符。

    代码:

    public class Solution {
        public String minWindow(String s, String t) {
            HashMap<Character,Integer> tmap = new HashMap<Character,Integer>();
            char[] tc = t.toCharArray();
            for(int i=0;i<tc.length;i++){ //将t转为数组后每一个字母作为键值放到hashmap中,出现的次数是其value值
                if(tmap.containsKey( tc[i] )){
                    tmap.put( tc[i],tmap.get(tc[i])+1 );              
                }
                else{
                    tmap.put( tc[i],1 );
                }
            }
            int left = 0,scond = 0;
            int count = 0;
            String ans = "";
            int minlen = s.length()+1;
            char []sc = s.toCharArray();
            for(int right = 0;right<s.length();right++){
                char rc = sc[right];  //right 对应的字符串
                if(tmap.containsKey( rc ) ){
                    tmap.put( rc,tmap.get(rc)-1 );//窗口中出现一次该字母 ,value值-- 
                    if( tmap.get(rc) >=0  ) //当在窗口中出现的次数小于在t中出现的次数时=,说明还不多于
                        count++;
                    while(count == t.length()){ // 当count等于t的长度时,做两件事,一left右移动,跳过不在t中出现的字符,或者出现次数多于t的
                        if( right-left+1 < minlen ){  //二:判断并更新最小窗口的值 和ans
                            ans = s.substring(left,right+1);
                            minlen = right-left+1;
                        }
                        char lc = sc[left]; //left对应的字符串
                        if( tmap.containsKey( lc ) ){
                            tmap.put( lc,tmap.get( lc )+1 );
                            if(tmap.get( lc ) >0 )
                                count--;
                        }
                        left++;
                    }
                }
            }
            return ans;
        }
    }
    
  • 相关阅读:
    读后感之—寒门学子重要选择-程序员
    架构中的分而治之
    如何从码农进化到项目管理者
    饿了么架构
    简单理解支付宝和蚂蚁花呗的架构
    架构小谈之美团外卖
    漫谈架构总结之1500
    平台基本信息项目目标文档
    第六学期每周总结-第三周
    质量管理之可用性战术分析
  • 原文地址:https://www.cnblogs.com/mxk-star/p/7327800.html
Copyright © 2011-2022 走看看