【剑斩OFFER】算法的暴力美学——串联所有单词的字串

一、题目描述

二、算法原理

我们可以看上面这个例子,我们记录s数组每个字母的个数,假设s数组在一段区间内的a、b、c的个数都为1,而和我们目标数组word的每个字母的个数相同,那么无论s数组的这段区间的a、b、c字母怎么排列都是我们目标的数组。

我们可以定义两个哈希表来记录每个单词的个数,又定义一个 count 来记录s组织的有效字母,有效字母就是:if:hash1 a <= hash a ,他是属于 word 字母中的其中一个,此时就是有效字母;我们记录的word字符串,所以当 right 遍历的字母大于word的长度时,我们就要移动 left 的指向的字母了,使他变得合法,同时也要把left指向的字母从hash1中移除。此时right往后遍历就行,不用返回到和 left 指向的字母一样的下标,因为left到right之间的字母都没有符合word,所以就算right回到跟left指向的字母的下标一样,然后重新遍历,当遍历到和上次的right指向的字母的下标时,此时也是不符合word字符串的,所以当left要更新时,right 往后遍历就行。只要 count 等于word的字母个数,此时就是我们要的答案。

而本道题目跟上面的例子差不多一样的解法,只不过是要字母变成了单词罢了,细节:

因为我们要遍历的是单词,又因为words中的所有单词的长度都一样,我们不知道从s中的那个下标有可能够成符合条件单词的下标,所以我们我们要遍历words中的单词的长度遍s,不可能大于这个长度,当大于这个长度时表明前面的单词不要了。

因为我们遍历的是单词所以right每次移动 words 中的单词长度。

三、代码实现

cpp 复制代码
class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        unordered_map<string,int> mp;
        for(auto& e : words)
        {
            mp[e]++;
        }

        int len = words[0].size();
        int size = words.size();

        vector<int> ret;

        for(int i = 0; i < len;i++)
        {
            int left = i;
            int count = 0;
            unordered_map<string,int> mp1;
            for(int right = i; right < s.size();right += len)
            {
                string str;
                str = s.substr(right,len);
                mp1[str]++;
                if(mp1[str] && mp1[str] <= mp[str]) count++;
                while(right - left + 1 > size*len)
                {
                    string tmp;
                    tmp = s.substr(left,len);
                    if(mp1[tmp] <= mp[tmp]) count--;
                    mp1[tmp]--;
                    left += len;
                }
                if(count == size) ret.push_back(left);
            }
        }
        return ret;
    }
};
相关推荐
wabs66626 分钟前
关于二叉树【力扣144.二叉树的前序遍历的思考】
数据结构·c++·算法·leetcode·二叉树
郝学胜-神的一滴36 分钟前
C++20 高级编程 004:从初始化、内存到const系列关键字
开发语言·算法·编程·软件构建·c++20
kyle~42 分钟前
点云配准--- 迭代最近点 ICP 求解
线性代数·算法·机器学习
LuminousCPP1 小时前
数据结构-二叉树(三):堆复杂度证明与 Top-K 问题|错位相减推导 + 海量数据内存优化
c语言·数据结构·笔记·排序算法
qq7422349841 小时前
Gradio 极简入门:三分钟为AI模型打造交互界面,并对比Streamlit与Dash如何选型
人工智能·算法·大模型·交互·dash
1000世界小札7 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
2601_956121979 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
兴通物联科技11 小时前
SMT PCB 微小 DataMatrix 码扫不动问题分析 兴通 XT8601B 600 万像素工业读码器落地实践
大数据·人工智能·单片机·嵌入式硬件·算法·计算机视觉
月华路13 小时前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法