leetcode30:串联所有单词的字串

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> answer;
        if(!s.length()) return answer;
        int all=0;
        int num=words[0].size();
        int w = words.size();
        int l =s.length();
        map<string,int> m;
        for(int i=0;i<w;i++){
            all+=words[i].length();
            m[words[i]]+=1;
        }
        if(l<all) return answer;
        for(int start=0;start<num;start++){
            map<string,int> new_m = m;
            vector<string> n_s; 
            for(int i=start;i<=l-num;){
                string t;
                for(int k=0;k<num;k++) t+=s[i++];
                n_s.push_back(t);
            }
            int num_ns = n_s.size();
            if(num_ns < w)  break;
            for(int i=0;i<w;i++){
                new_m[n_s[i]]-=1;
                if(new_m[n_s[i]]==0) new_m.erase(n_s[i]);
            }
            if(new_m.empty()) answer.push_back(start);
            for(int i=1;i<=num_ns-w;i++){
                new_m[n_s[i-1]]+=1;
                if(new_m[n_s[i-1]]==0) new_m.erase(n_s[i-1]);
                new_m[n_s[i+w-1]]-=1;
                if(new_m[n_s[i+w-1]]==0) new_m.erase(n_s[i+w-1]);
                if(new_m.empty()) answer.push_back(start+i*num);
            }
        }
        return answer;
    }
};

假设每个单词长度为number,将字符串以0到number-1为起点作步长为number的分割,不足一个单词长度number的赘余舍去,然后依次作滑动窗口遍历,如果单词集合中有这个单词,则对应的数量减一,没有则加一,当单词集中没有单词了,自然表明该子串满足要求可行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值