zoukankan      html  css  js  c++  java
  • 72.Minimum Window Substring(最小子串窗口)

    Level:

      Hard

    题目描述:

    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).

    Example:

    Input: S = "ADOBECODEBANC", T = "ABC"
    Output: "BANC"
    

    Note:

    • If there is no such window in S that covers all characters in T, return the empty string "".
    • If there is such window, you are guaranteed that there will always be only one unique minimum window in S.

    思路分析:

    知识点:滑动窗口

      关键点一:像这种找子串的可以使用滑动窗口Sliding Window来做。这个窗口由left和right来约束[left,right]这个闭区间,刚开始知识left=right=0,然后left不变,right不断增长,直到到达某个值,left和right一起增长,这样就实现了窗口的创建和向下滑动。

      关键点二:对于p中出现的字符以及次数需要记下来。可以使用一个数组ascaiiNums,长度为256,是因为ascaii一共只有256个,初始化的值表示角标对应的ascaii字符在p中出现的次数,那么没有出现过的就是0.之后如果s中出现过该字符,那么数组对应位置的值就减一。如果减之后的值大于等于0,就说明p中该字符出现了一次,这时p中未出现的字符数量count就减一。之所以要判断是>=0,是因为如果数组中原来的值是0(说明p中没有出现),那么减一后就成了负的,这种情况下p中剩下未出现的字符的count数值保持不变。如果count的值为0,说明p中的字符全出现了,找到一个符合条件的子串,left就是子串的首地址。之后要向右滑动窗口,移动的方法是left++,right++,更新p中未出现的字符个数count。

    代码:

    public class Solution{
        public String minWindow(String s,String t){
            if(s==null||t==null||s.length()==0||t.length()==0)
                return null;
            String res="";
            int []map=new int [256];
            int match=t.length();
            int left=0; //窗口左端
            for(int i=0;i<t.length();i++){
                map[t.charAt(i)]++;
            }
            int minlen=Integer.MAX_VALUE;
            for(int i=0;i<s.length();i++){//i充当窗口的右端
                map[s.charAt(i)]--;
                if(map[s.charAt(i)]>=0)
                    match--;         //证明该字符在t中
                if(match==0){
                    while(map[s.charAt(left)]<0){
                        map[s.charAt(left)]++;
                        left++; //这些字符都不存在与t中
                    }
                    if((i-left+1)<minlen){//更新最短子串
                        minlen=i-left+1;
                        res=s.substring(left,i+1);
                    }
                match++; //寻找下一个包含t的串
                map[s.charAt(left)]++;
                left++;
                }
            }
            return minlen==Integer.MAX_VALUE?"":res;
        }
    }
    
  • 相关阅读:
    SAP CRM服务订单页面显示组织结构管理区域的实现逻辑
    ABAP面试问题
    用NVIDIA NsightcComputeRoofline分析加速高性能HPC的应用
    Pipe Utilization管道利用率
    Nsight Compute Profilier 分析
    NSight Compute 用户手册(下)
    NSight Compute 用户手册(中)
    NSight Compute 用户手册(上)
    NVIDIA Nsight Systems CUDA 跟踪
    TensorRT Analysis Report分析报告
  • 原文地址:https://www.cnblogs.com/yjxyy/p/11098228.html
Copyright © 2011-2022 走看看