zoukankan      html  css  js  c++  java
  • 滑动窗口+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;
        }
    };
  • 相关阅读:
    每日英语:Yahoo's Rally: Made in China
    【Java线程】Callable和Future
    Throwable和Exception的区别
    Java异常分类
    牛客网上的剑指offer题目
    合并两个排序的链表
    反转链表
    链表中倒数第k个结点
    调整数组顺序使奇数位于偶数前面
    数值的整数次方
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12583841.html
Copyright © 2011-2022 走看看