【力扣T30】串联所有单词的字串

【力扣T30】串联所有单词的字串


题干

【力扣T30】串联所有单词的字串

数据范围

【力扣T30】串联所有单词的字串

解析

数据范围1e4,复杂度要小于O(n2)
所用算法:哈希表,双指针(滑动窗口)。
哈希表和cnt变量维护了滑动窗口内的信息。两个指针分别是jj-m*w。把整个s串分段,每段长度为w,枚举匹配起点i,重要的是如何根据tot和wd哈希表的内容判断“有效串”增加还是减少。另外给大家推荐学算法网站acwing。

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> res;
        if(words.size()==0) return res;
        int n=s.size(),m=words.size(),w=words[0].size();
        unordered_map<string,int> tot;
        for(auto& word:words) tot[word]++;
        for(int i=0;i<w;i++){
            unordered_map<string,int> wd;
            int cnt=0;
            for(int j=i;j+w<=n;j+=w){
                if(j>=i+w*m){
                    auto word=s.substr(j-m*w,w);
                    wd[word]--;
                    if(wd[word]<tot[word]) cnt--;
                }
                auto word=s.substr(j,w);
                wd[word]++;
                if(wd[word]<=tot[word]) cnt++;
                if(cnt==m) res.push_back(j-(m-1)*w);
            }
        }
        return res;
    }
};

总结

哈希表,双指针,滑动窗口。

上一篇:三星exynos2200相当于骁龙多少


下一篇:OSPF实验