[Leetcode]_30 Substring with Concatenation of All Words

本文介绍了一种通过模拟法解决子串拼接查找问题的算法。该算法旨在判断一个给定字符串中是否存在由另一组字符串集合中所有元素连续拼接而成的子串。文章详细解释了算法的实现步骤,并提供了一个具体的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 *  Index: 30
 *  Title: Substring with Concatenation of All Words
 *  Author: ltree98
 **/

题意就是求字符串s中是否有子串是全由容器words内字符串组成的。


模拟法

模拟求这个问题的方法:
1.取原串一部分,然后看子串容器中是否有它,如果有往下看(跳到2);如果没有则失败。(回到1)
2.子串容器中有这部分,看用了几次,用的次数小于等于子串容器中拥有的个数,继续往下(跳到3),否则失败。(回到1)
3.如果已经匹配完了所有子串,成功,记录序列值。(回到1)

这里要注意一下,构建比较标准映射的值,不可以全置为固定值,而是要用递增。
因为,子串可能有重复的值。

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        int sLen = s.length(), wordsSize = words.size(), perWordLen = words[0].length();
        map<string, int> baseMap;
        for(int i = 0; i < wordsSize; i++)
            ++baseMap[words[i]];

        vector<int> ans;
        for(int i = 0; i < sLen-wordsSize*perWordLen+1; i++)    {
            map<string, int> comparedMap;
            int j = 0;
            while(j < wordsSize)    {
                string word = s.substr(i+j*perWordLen, perWordLen);
                if(baseMap.find(word) != baseMap.end()) {
                    ++comparedMap[word];
                    if(comparedMap[word] > baseMap[word])
                        break;
                }
                else    break;
                ++j;
            }
            if(j == wordsSize)
                ans.push_back(i);
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值