先对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. CI/CD持续集成小结

    一.概念 什么是devops,基于Gitlab从零开始搭建自己的持续集成流水线(Pipeline) https://blog.csdn.net/chengzi_comm/article/details ...

  2. Form组件 cookie和session

    django form组件 1.渲染标签 2.校验数据 3.展示信息 第一步需要一个form类 from django import forms class MyForm(forms.Form): n ...

  3. 08_Redis通用命令

    keys pattern:获取所有与pattern匹配的key,返回所有与该key匹配的keys:通配符:*表示任意0个或多个任意字符,?表示任意一个字符

  4. Shell 语法报错记录

    sh: missing ] if 条件语句 “或”多个条件并行时 执行then命令 变量a等于aa且变量b等于bb 或者 变量c等于cc且变量d等于dd 这样的条件成立的话,输出success if ...

  5. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?(未完成)

    两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?(未完成)

  6. Spring 注解无效 空指针异常

    对于Java开发,现在Spring已成为一种生态,使用Spring成为一种享受,Spring的使用让开发变得更加便捷. 而Spring好用归好用,若不清楚里面的工作原理,使用的时候难免会踩到一些坑. ...

  7. string::copy

    size_t copy (char* s, size_t len, size_t pos = 0) const;功能:把string的pos位置开始的len字节copy到s注意:s的最后要手动添加字符 ...

  8. Spring入门篇——第7章 Spring对AspectJ的支持

    第7章 Spring对AspectJ的支持 介绍Spring对AspectJ的支持 7-1 AspectJ介绍及Pointcut注解应用 实例 完成了在xml文件的配置 7-2 Advice定义及实例 ...

  9. nginx常用命令和配置

    1.常用命令 查看版本号: ./nginx -v   启动nginx:在/usr/local/nginx/sbin 目录下执行  ./nginx   关闭nginx:在/usr/local/nginx ...

  10. 防止sql注入的参数化查询

    参数化查询为什么能够防止SQL注入 http://netsecurity.51cto.com/art/201301/377209.htm OleDbDataAdapter Class http://m ...