leetcode-串联所有单词的子串(未解决)

(代码题解来源于leetcode,非本人题解)

30. 串联所有单词的子串 - 力扣(LeetCode)

题解一:

参考题解:30. 串联所有单词的子串 - 力扣(LeetCode)


作者思路解析:

思路一:单词长度固定,如为t,可以将字符串s按照固定长度t进行切割,存储哈希表,一个哈希表是利用字符串s截取后的各个单词,一个哈希表是输入的单词组,判断两者是否相等。此时,遍历和比较都是线性的,时间复杂度为O(n^2)

思路二:滑动窗口(python版本,没看)

 题解二:

参考题解:30. 串联所有单词的子串 - 力扣(LeetCode)

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        //基础判断 判断字符串与单词是否相等
        int n=words[0].size();//单词长度
        int len=n*words.size();//所有单词总长度
        if(s.size()<len) return {};

        //将字符串数组创建一个哈希表容器
        unordered_map<string,int> hash;
        for(auto& s:words) 
        {
            hash[s]++;
        }

        //
        vector<int> ret;
        unordered_map<string,int> temp;
        for(int k=0;k<n;k++)
        {
            int i=k,j=k,re=0;
            //i判断是否在字符串中
            while(i<s.size())
            {
                //j控制移动
                //j要在整个的字符串s中
                //且每次循环只在一串固定长度(字符数组所有单词个数)中判定
                if(j<s.size()&&j<i+len)
                {
                    //提取长度为n的子字符串
                    string str=s.substr(j,n);
                    //j向前移动n个位置
                    j+=n;
                    //哈希表中增加该str中的次数
                    //temp哈希表是存储字符串的哈希表
                    temp[str]++;
                    //该字符串在s中出现的次数如果小于单词数组哈希表中出现的次数 那么就++
                    //re统计了不重复的单词数量
                    if(temp[str]<=hash[str]) re++;
                }
                //直到每个固定长度结束
                else 
                {   
                    //判定是否匹配
                    if(re==words.size()) ret.push_back(i);
                    //逐步减去temp中统计的re的次数,开启下一次循环
                    string str=s.substr(i,n);
                    i+=n;
                    if(temp[str]<=hash[str]) re--;
                    temp[str]--;
                }
            }
            temp.clear();
        }
        return ret;
    }
};

 没看懂为什么要多起点??

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值