关于leetcode Minimum Window Substring的思考

本文探讨了LeetCode上的一道经典问题——最小窗口子串,并提供了一种高效的解决方案。通过对字符出现次数进行跟踪,利用滑动窗口技巧,实现了在O(n)的时间复杂度内找到包含所有目标字符的最小子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于leetcode 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.

首先,看完这题我首先想到用一个数组来标记

int temp[128]={0};//因为字符最大不会大于127,所以如此

接着,读入第二个串并记录,每个字符出现次数。
然后,从头开始当字符记录不为0

while(end<s.size()){
        if(temp[s[end]]!=0){
        temp[s[end]]--;//当所需子串多次出现 
        if(temp[s[end]]>=0)
        total--;
        if(temp[s[end]]==0){
        temp[s[end]]=-1;//用于标识该字符是否出现在子串。 
} 
end++;
}
else{
end++;
}

其中,最后是缩减子串,已获得更多解,以求最优解。

while(total==0){
             if(end-begin<ans) {
                ans=(end-begin) ;
                first=begin;
             }//存在更优解 

             if(temp[s[begin]]==-1) {
                total++;
                temp[s[begin]]=1;
             }
             if(temp[s[begin]]<-1)
             temp[s[begin]]++;
             begin++;//缩小区间 
            }
下面是完整代码:
string minWindow(string s, string t) {
        int temp[128]={0};
        for(int i=0;i<t.length();i++) temp[t[i]]++;
        int total=t.size(), begin=0, end=0, ans=INT_MAX, first=0;
        while(end<s.size()){
            if(temp[s[end]]!=0){
                temp[s[end]]--;//当所需子串多次出现 
            if(temp[s[end]]>=0)
                total--;
                if( temp[s[end]]==0){
                        temp[s[end]]=-1;//用于标识该字符是否出现在子串。 
                } 
                end++;
            }
            else{
                end++;
            }

            while(total==0){
             if(end-begin<ans) {
                ans=(end-begin) ;
                first=begin;
             }//存在更优解 

             if(temp[s[begin]]==-1) {
                total++;
                temp[s[begin]]=1;
             }
             if(temp[s[begin]]<-1)
             temp[s[begin]]++;
             begin++;//缩小区间 
            }

        }

        return ans==INT_MAX? "":s.substr(first, ans);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值