leetcode: Minimum Window Substring

本文介绍了一种算法,通过使用两个指针扫描字符串,高效地找出包含目标字符串的所有可能窗口中长度最短的一个。该算法在O(n)时间内完成搜索。

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

还是使用两个指针扫描字符串S,两个数组标示T中所有字符的出现情况和次数。  后一个指针ed不断扫描找到所有包含T的窗口,找到时从S的初始位置开始利用st指针收缩窗口直到不能收缩为止。   这样可以保证在O(n)的时间内扫描出所有的可能的窗口组合,找到其中最短的即可。

class Solution {
public:
    string minWindow(string S, string T) {
        int flag[256];
        int times[256];
        memset( flag,0,sizeof(flag) );
        memset( times,0,sizeof(times) );
        for( int i=0;i<T.size();i++ )
        {
            flag[T[i]] = 1;
            times[T[i]]++;
        }
        int TL = T.size();
        int MIN = INT_MAX;
        int st=0,MinSt=0,ed=0;
        for( ;ed<S.size();ed++ )
        {
            if( flag[S[ed]] == 1 )
            {
                times[S[ed]]--;
                if( times[S[ed]]>=0 )
                {
                    TL--;
                }
            }
            if( TL==0 && flag[S[ed]] == 1 )
            {
                while(1)
                {
                    if( flag[S[st]]==1 )
                    {
                        if( times[S[st]] < 0 )
                        {
                            times[S[st]]++;
                        }
                        else
                        {
                            break;
                        }
                    }
                    st++;
                }
                if( MIN>ed-st+1 )
                {
                    MIN = ed-st+1;
                    MinSt = st;
                }
            }
        }
        if( MIN == INT_MAX )
        {
            return "";
        }
        string res(S,MinSt,MIN);
        return res;
        
        
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值