leetcode 30 串联所有单词的子串( 困难)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:滑动窗口
提示一:两个hash的比较通过还款机制解决。
提示二:每次移动每个单词的长度mn,因此可以分组来解决:隔mn距离的为一组,一共有mn组,起点分别为0 1…mn-1。只要起点从这些位置开始,然后使用滑动窗口机制即可

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
 
        int n = s.size(), m = words.size(), len = words[0].size(), tol = m * len;
        unordered_map<string, int> hash, hash2;
        vector<int> ans;
        for (auto& s : words) hash2[s]++;
        int cnt = 0;
        for (int i = 0; i < len; ++i) { //分组,0->len-1为每一组
            hash = hash2; //测试每一组的时候hash要是之前的hash2
            int cnt = 0, l = i;
            if (i + tol > n) break; //
            for (int r = i; r + len <= n; r += len) {
                string sl = s.substr(l, len), sr = s.substr(r, len);
                if (r >= i + tol) {
                    if (hash.count(sl) && ++hash[sl] > 0) cnt--;
                    l += len;
                }
                if (hash.count(sr) && (--hash[sr] >= 0)) cnt++;
                if (cnt == m) ans.push_back(l);
            }
        }
        return ans;
    }
};

易错点
1:当大于时break
2:测试每一组的时候hash要是之前的hash2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值