【剑斩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;
    }
};
相关推荐
郝学胜-神的一滴1 小时前
Effective Python 条款 13:善用星号解包,告别下标切片拆分的坑
服务器·开发语言·数据结构·python·程序人生·pycharm
Logic1012 小时前
C语言/数据结构位运算题解:异或XOR找出流水线上的“独特零件编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
weixin_307779132 小时前
C++代码实现MATLAB中的ode45函数功能
开发语言·c++·算法·matlab
张小姐的猫2 小时前
【AI大模型接入SDK】 —— 数据管理 & 与Session模块进行联动
数据结构·数据库·c++·人工智能·python·chatgpt
不穿鞋的懒羊羊2 小时前
dfs深度优先搜索
算法
OYYHXPJR3 小时前
【算法】区间重叠模板和矩形重叠模板
算法
shehuiyuelaiyuehao3 小时前
算法46,分治快排,排序数组
java·算法·排序算法·排序
careathers3 小时前
【数据结构】栈
java·数据结构
远航计算机3 小时前
GEO 选题从哪来?用一份 Query 词库把一年内容排出来
大数据·人工智能·算法·aigc
宣宣猪的小花园.3 小时前
【机器学习】神经网络与表征:为什么深度学习能自动提取特征
人工智能·嵌入式硬件·算法·机器学习