leecode题目30

作者通过LeetCode上的问题,描述了解决substringwithconcatenationofallwords问题的方法,利用哈希表统计子串在给定单词列表中的频次差,通过滑动窗口找到匹配的子串并存储结果。
摘要由CSDN通过智能技术生成

今天是被这道题摁着锤,先说说我最开始得想法,第一个是把所有得子串都求出来,写代码得时候不知道怎么做,后面想了个另外得方法,就是匹配,找出一个窗口,按顺序取出来,跟vector对比,发现这样如果出现一样得单词,那不是歇菜了。。。

今天想了很久,还是只能求助解题,主要是看官方的,官方的解题和我窗口的想法类似,不过他是按照单词的频次来匹配,天才呀。这样就不用管vector里面的内容了,只需要频次对的上就行。不过一开始这个代码,看到有点懵,也是看了很久。

class Solution {
public:
    vector<int> findSubstring(string &s, vector<string> &words) {
        vector<int> res;
        int m = words.size(), n = words[0].size(), ls = s.size();
        for (int i = 0; i < n && i + m * n <= ls; ++i) {
            unordered_map<string, int> differ;
            for (int j = 0; j < m; ++j) {
                ++differ[s.substr(i + j * n, n)];
            }
            for (string &word: words) {
                if (--differ[word] == 0) {
                    differ.erase(word);
                }
            }
            for (int start = i; start < ls - m * n + 1; start += n) {
                if (start != i) {
                    string word = s.substr(start + (m - 1) * n, n);
                    if (++differ[word] == 0) {
                        differ.erase(word);
                    }
                    word = s.substr(start - n, n);
                    if (--differ[word] == 0) {
                        differ.erase(word);
                    }
                }
                if (differ.empty()) {
                    res.emplace_back(start);
                }
            }
        }
        return res;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/substring-with-concatenation-of-all-words/solutions/1616997/chuan-lian-suo-you-dan-ci-de-zi-chuan-by-244a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这里就说说我自己的想法吧!!!!

他是利用了一个哈希表,c++里面是unordered_map,这是类似python字典的东西,是个键值对。来统计单词出现的频次。官方是将s中出现的,+1,words里面的,-1.这样来统计s窗口和words之间的频次差。

后面就是滑动窗口了。最后如果频次差为0,就说明匹配了,把start加到res结果中,最后输出结果。

这个题目这么说呢,看了答案,感觉蛮简单的,主要是频次差这个想法,不存在我的脑子里。当然这个或许熟能生巧之后会。可以想到这个解题方案吧。加油吧!!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值