先对words中的单词排列组合,然后对s滑窗操作;部分样例超时,代码如下:

class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
//dfs找出words所有组合,然后在s滑窗 //排除异常情况
int len=0;
for(auto w:words){
len+=w.size();
}
if(len==0 || s.size()==0 || len>s.size()) return {}; //排列组合words
set<string> s_words;
vector<int> indexs; for(int i=0;i<words.size();i++){
indexs.push_back(i);
}
do{
string tmp="";
for(int i=0;i<indexs.size();i++){
tmp+=words[indexs[i]];
}
s_words.insert(tmp); }while(next_permutation(indexs.begin(),indexs.end())); //在s中滑窗寻找起始位置,O(m*n*k) m为s长度,n为s_words字符串个数,k为subs的长度;
vector<int> res;
for(int i=0;i<=s.length()-len;i++){
string subs=s.substr(i,len);
if(s_words.find(subs)!=s_words.end()){
res.push_back(i);
}
}
return res;
}
};

下面也超时,均执行至148/173

class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
//dfs找出words所有组合,然后在s滑窗 //排除异常情况
int len=0;
for(auto w:words){
len+=w.size();
}
if(len==0 || s.size()==0 || len>s.size()) return {}; //排列组合words
set<string> s_words;
vector<int> indexs; for(int i=0;i<words.size();i++){
indexs.push_back(i);
}
do{
string tmp="";
for(int i=0;i<indexs.size();i++){
tmp+=words[indexs[i]];
}
s_words.insert(tmp); }while(next_permutation(indexs.begin(),indexs.end())); //在s中滑窗寻找起始位置,O(m*n*k) m为s长度,n为s_words字符串个数,k为subs的长度;
vector<int> res;
for(int i=0;i<=s.length()-len;i++){
string subs=s.substr(i,len);
for(auto it=s_words.begin();it!=s_words.end();it++){
string tmp=*it;
int flag=1;
for(int j=0;j<len;j++){
if(tmp[j]!=subs[j]){
flag=0;break;
}
}
if(flag==1) {
res.push_back(i);break;
}
}
}
return res;
}
};

想办法对暴力算法进行提速,

以下为别人的提速方案,可行;

作者:Xdo

链接:https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words/solution/bao-li-suan-fa-jia-ru-qu-zhong-you-hua-10bei-ti-su/

思路就是,先把存在的字符串,放到 hashmap ,可以快速比较,然后每一个位置都进行匹配

但这里会有很多的重复计算,就可以使用一个小技巧,先计算目标串的每个字母的 ASCII 和,

然后和当前要匹配的字符串的每个字母的 ASCII 进行比较,如果不相等就不用进行下面的匹配过程了

class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> res;
if(words.size()<1 || s.size()<1 || s.size() < words[0].size()*words.size()) return res;
int wordLen = words[0].size(), lens = wordLen*words.size(), target = 0, cur = 0;
unordered_map<string,int> allWord;
for(auto& it:words){
allWord[it]++;
for(auto& i:it) target += i;
}
for(int i=0; i<lens; i++) cur += s[i];
// 先看当前字符串的 ASCII 码相加是否相等 方便去重
for(int i=0, j; i<=s.size()-lens; cur -= s[i], cur += s[lens + i++]){
// 快速去重
if(cur != target) continue;
// 确认一下,是否为真的匹配
unordered_map<string,int> tem(allWord);
for(j=i; j<i+lens; j+=wordLen)
if(tem[s.substr(j, wordLen)]-- == 0) break;
if(j == i+lens) res.push_back(i);
}
return res;
}
};

leetcode30 串联所有单词的子串的更多相关文章

  1. [LeetCode] Substring with Concatenation of All Words 串联所有单词的子串

    You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...

  2. 【LeetCode-面试算法经典-Java实现】【030-Substring with Concatenation of All Words(串联全部单词的子串)】

    [030-Substring with Concatenation of All Words(串联全部单词的子串)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Yo ...

  3. [LeetCode] 30. Substring with Concatenation of All Words 串联所有单词的子串

    You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...

  4. Java实现 LeetCode 30 串联所有单词的子串

    30. 串联所有单词的子串 给定一个字符串 s 和一些长度相同的单词 words.找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置. 注意子串要与 words 中的单词完全匹配, ...

  5. [LeetCode] 30. 串联所有单词的子串

    题目链接: https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words/ 题目描述: 给定一个字符串 s 和一 ...

  6. Leetcode 30 串联所有单词的子串 滑动窗口+map

    见注释.滑动窗口还是好用. class Solution { public: vector<int> findSubstring(string s, vector<string> ...

  7. 【LeetCode 30】串联所有单词的子串

    题目链接 [题解] 开个字典树记录下所有的单词. 然后注意题目的已知条件 每个单词的长度都是一样的. 这就说明不会出现某个字符串是另外一个字符串的前缀的情况(除非相同). 所以可以贪心地匹配(遇到什么 ...

  8. [Swift]LeetCode30. 与所有单词相关联的字串 | Substring with Concatenation of All Words

    You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...

  9. #leetcode刷题之路30-串联所有单词的子串

    给定一个字符串 s 和一些长度相同的单词 words.找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置.注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考 ...

随机推荐

  1. android适配知识总结

    一.http适配 背景:API升级到28以后,不再支持明文的网络请求,只支持https请求.运行所报错误:java.net.UnknownServiceException: CLEARTEXT com ...

  2. BootStrap【一、概述】

    4月底出去浪了一圈,回来收了一周的心才收回来,5.12,重启自学 今天早上总算大概把JAVASpring相关的东西过了一边,Spring基础.IOC.AOP,看的有些头晕脑胀 公司项目除了Spring ...

  3. 在线预览word、excel文件

    直接使用微软提供的在线预览服务. 免费 文件必须为网可访问地址,因为微软的服务器需要访问该文件

  4. 【2017-06-02】Linq高级查询,实现分页组合查询。

    1.以XXX开头 2.以XXX结尾 3.模糊查询 4.求个数 5.求最大值 6.求最小值 7.求平均值 8.求和 9.升序 10.降序 11.分页 Skip()跳过多少条 Take()取多少条 12. ...

  5. 04_ Flume采集文件到HDFS案例

    采集需求:比如业务系统使用log4j生成的日志,日志内容不断增加,需要把追加到日志文件中的数据实时采集到hdfs 根据需求,首先定义以下3大要素 采集源,即source——监控文件内容更新 :  ex ...

  6. Nexus Repository Manager OSS 2 配置阿里云私服做代理的坑

    安装 搭建 Nexus 私服很简单,官网下载,解压: 使用管理员权限打开cmd: > cd nexus---bundle\nexus--\bin > nexus.bat install # ...

  7. PAT Basic 1059 C语言竞赛 (20 分)

    C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛.既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽: 0.冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……). 1.排名为素数的学生将 ...

  8. java——double数据精度问题

    代码:使用BigDecimal来代替double public class BigDecimalUtil { public static BigDecimal add(double v1,double ...

  9. js技术javascript 该重视

    当下,js大有挤压php java asp.net之类后端语言的趋势,直接js html5 socket与后端python c c++ 等通信 更不用提二维 三维计算展示 方面 医院呼叫 报警  处理 ...

  10. python __file__ is not defined 解决方法

    python __file__ is not defined 解决方法 __file__ 是在python module 被导入的时候生成的一个变量,所以在 __file__ 不能被使用,但是又想获取 ...