滑动窗口+substr+map——leetcode30

设单位串长度为k,在母串上维护区间[l,r],右端点每次向右移动k,截取的长为k的字符串tmp,看字符串集里是否有这个串

  如果没有,那么[l,r]这一整段都清空掉,l=r=r+k

  如果有,那么进行滑动窗口,当且仅当[l,r]区间出现的每种单位串数量<=每种给定集合的单位串数量,l才不往右移动

  同时维护[l,r]里包含的单位串数量tot,如果tot=n,那么l就是一个答案

教会了我substr怎么用。。

class Solution {
public:
    
    vector<int>ans;
    unordered_map<string,int> cnt;
    int n,k,len;

    vector<int> findSubstring(string s, vector<string>& words) {
        if(words.size()==0)return ans;
        n=words.size();
        k=words[0].size();
        len=s.size();
        if(n*k>s.size())return ans;

        for(auto s:words)cnt[s]++;
        
        for(int i=0;i<k;i++){
            int tot=0;
            unordered_map<string,int> mp;
            int l=i,r=i;
            while(r+k-1<=len-1){
                string tmp=s.substr(r,k);
                if(cnt[tmp]==0){
                    r+=k;l=r;tot=0;
                    mp.clear();continue;
                }else {
                    tot++;
                    mp[tmp]++;
                    r+=k;
                    while(cnt[tmp]<mp[tmp]){
                        string t=s.substr(l,k);
                        mp[t]--;tot--;
                        l+=k;
                    }
                }
                if(tot==n)ans.push_back(l);
            }
        }

        return ans;
    }
};

 

posted on 2020-03-27 19:24  zsben  阅读(163)  评论(0编辑  收藏  举报

导航