leetcode_c++:哈希:Group Anagrams (076)


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


算法

O(N)
快慢指针,块指针跑到位置,然后再向前缩进慢指针;
计算匹配可以使用hash或者是数组


class Solution {
private:
    int sta[255]={0};
    int wnd[255]={0};
public:
    string minWindow(string s, string t) {
        if(s.empty()||t.empty())
            return "";
        int slen=s.length(),tlen=t.length();
        int res_pos=0; //position of result
        int min_len=INT_MAX;
        int count=0; //match count in windows
        int slow=0,fast=0;

        //deal T
        for(int i=0;i<tlen;++i)
            ++sta[t[i]];
        //count
        for(int fast=0;fast<slen;++fast){
            int idx=s[fast];
            ++wnd[idx];
            if(wnd[idx]<=sta[idx])
                ++count;
            //match enough
            if(count>=tlen){
                while(wnd[s[slow]]>sta[s[slow]])
                    --wnd[s[slow++]]; //euqal to: wnd[s[slow]]--; slow++
                if(fast-slow+1<min_len){
                    min_len=fast-slow+1;
                    res_pos=slow;
                }

                //make it not enough again
                --wnd[s[slow++]];
                --count;
            }

        }



        return s.substr(res_pos,min_len==INT_MAX? 0:min_len);

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值