You are given a string, S, and a list of words, L, that are all of the same length. Find all starting indices of substring(s) in S that is a concatenation of each word in L exactly once and without any intervening characters.

For example, given:
S: "barfoothefoobarman"
L: ["foo", "bar"]

You should return the indices: [0,9].
(order does not matter).

我的思路,

设S的长度为Slen, L的长度为Llen, L中每个单词的长度为Lstrlen

把L中的单词排序

首个字符遍历S中的每一个字符

然后以首字符为起点,获取Llen个Lstrlen长度的单词,把获取的单词排序。

比较两个排序后的单词是否相同。相同则压入答案,不同则遍历下一个起点。

时间复杂度为O(Slen*Llen*log(Llen))

结果超时了。分析一下原因:

S: "barfoothefoobarman"
L: ["foo", "bar"]

在遍历第一个起始点时,我们获取了 bar  foo

在遍历第4个起始点时,我们获取了  foo the.  但这个foo在遍历第一个起始点时已经遍历过了,故我们做了重复的计算。

------------------------------------------------------------------------------------------------------

下面是大神O(Slen*Lstrlen)的答案

用hash表cn记录每个单词出现的次数

对 i = 0 - Lstrlen 遍历

对 j = i - Slen遍历  ;j+= Lstrlen

获取以j为起点的一个单词。

if(不存在这个单词)

起始位置订到下一个单词起始点,数据清0

else if(存在这个单词,并且出现次数小于cn中统计的次数)

获取的单词数增加

else(存在这个单词,但出现次数大于等于cn中统计的次数)

把起始位置重新定位到这个单词第一次出现之后

if(获取单词数==L中单词数)

压入答案

class Solution {
public:
//超时
vector<int> findSubstring2(string S, vector<string> &L) {
vector<int> ans;
if(L.empty()) //L是空的
{
return ans;
}
int Llen = L.size();
int Slen = S.size();
int Lstrlen = L[].size(); if(Slen < Lstrlen) //S没有L中的字符串长
{
return ans;
} sort(L.begin(), L.end()); for(int i = ; i < Slen - Llen * Lstrlen; i++)//起始位置循环
{
bool isOK = true;
vector<string> cur;
for(int j = ; j < Llen; j++)
{
cur.push_back(S.substr(i + j * Lstrlen, Lstrlen));
}
sort(cur.begin(), cur.end());
for(int j = ; j < Llen; j++)
{
if(cur[j] != L[j])
{
isOK = false;
break;
}
}
if(isOK)
{
ans.push_back(i);
i += Llen * Lstrlen - ;
}
}
return ans;
}
}; //大神可以通过的代码
class Solution2 {
private:
vector<int> res;
map<string,int> cntL;
map<string,int> cn;
int n ;
public:
vector<int> findSubstring(string S, vector<string> &L)
{ res.clear();
cntL.clear();
cn.clear(); n = S.length();
int e = L.size();
int t = L[].length();
int k = ; for(int i = ; i < e ; i++)
{ if(cn.count(L[i]) == )
{ cn[L[i]] = ;
k++;
}
else
{ cn[L[i]] += ;
k++;
}
} string tr ,du;
int r = ;
int st = ; for(int j = ; j < t ; j++)
{ r = ; st = j;
for(int i = j; i < n; i += t)
{ tr = S.substr(i,t);
if( cn.count(tr) == || cn[tr] == )
{ cntL.clear();
r = ;
st = i+t;
}
else if(cntL[tr] < cn[tr])
{ cntL[tr] += ;
r++;
}
else
{ du = S.substr(st,t);
while(du != tr)
{ cntL[du]--;
r--;
st += t;
du = S.substr(st,t);
}
st += t;
}
if(r == k)
{ res.push_back(st);
du = S.substr(st,t);
cntL[du]--;
r--;
st += t;
} }
cntL.clear();
}
sort(res.begin(),res.end());
return res ;
}
};

【leetcode】Substring with Concatenation of All Words (hard) ★的更多相关文章

  1. 【leetcode】Substring with Concatenation of All Words

    Substring with Concatenation of All Words You are given a string, S, and a list of words, L, that ar ...

  2. 【LeetCode】哈希表 hash_table(共88题)

    [1]Two Sum (2018年11月9日,k-sum专题,算法群衍生题) 给了一个数组 nums, 和一个 target 数字,要求返回一个下标的 pair, 使得这两个元素相加等于 target ...

  3. 【LeetCode】双指针 two_pointers(共47题)

    [3]Longest Substring Without Repeating Characters [11]Container With Most Water [15]3Sum (2019年2月26日 ...

  4. 【LeetCode】字符串 string(共112题)

    [3]Longest Substring Without Repeating Characters (2019年1月22日,复习) [5]Longest Palindromic Substring ( ...

  5. 【leetcode】Find All Anagrams in a String

    [leetcode]438. Find All Anagrams in a String Given a string s and a non-empty string p, find all the ...

  6. 【LeetCode】代码模板,刷题必会

    目录 二分查找 排序的写法 BFS的写法 DFS的写法 回溯法 树 递归 迭代 前序遍历 中序遍历 后序遍历 构建完全二叉树 并查集 前缀树 图遍历 Dijkstra算法 Floyd-Warshall ...

  7. 【LeetCode】718. Maximum Length of Repeated Subarray 解题报告(Python)

    [LeetCode]718. Maximum Length of Repeated Subarray 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxu ...

  8. 【LeetCode】647. Palindromic Substrings 解题报告(Python)

    [LeetCode]647. Palindromic Substrings 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/p ...

  9. 【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java

    [LeetCode]Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum dept ...

随机推荐

  1. [转]Informatica vs SSIS

    转自 http://blog.csdn.net/thy822/article/details/8489779 这篇文章, 我不能同意更多, 所以转在这里. Here is my thinking af ...

  2. php 短路逻辑运算符

    短路与 && 短路或 || or.||.and.&& 都是短路运算符 &&(and)短路与运算符检查第一个表达式是否返回“flase”,如果是“fals ...

  3. “RESTful架构”相关资料收藏

    [阮一峰]理解RESTful架构 [InfoQ]深入浅出REST 用于构建 RESTful Web 服务的多层架构 REST会是SOA的未来吗? Restful 与 SOA 的关系? 回答1: 注意r ...

  4. 淘宝(阿里百川)手机客户端开发日记第一篇 android 主框架搭建(一)

    android 主框架搭建(一) 1.开发环境:Android Studio 相继点击下一步,直接项目建立完毕(如下图) 图片看的效果如果很小,请放大您的浏览器显示百分比  转载请注明http://w ...

  5. Codeforces Round #292 (Div. 2) C. Drazil and Factorial

    题目链接:http://codeforces.com/contest/515/problem/C 给出一个公式例如:F(135) = 1! * 3! * 5!; 现在给你一个有n位的数字a,让你求这样 ...

  6. [codeforces 360]A. Levko and Array Recovery

    [codeforces 360]A. Levko and Array Recovery 试题描述 Levko loves array a1, a2, ... , an, consisting of i ...

  7. word20161204

    CA, certification authority / 证书颁发机构 cache / 高速缓存 cache file / 缓存文件 caching / 缓存 caching resolver /  ...

  8. hibernate 学习知识总结

    1.最近用hibernate 学会很多知识,总结如下: (1)数据库表格已经设置默认值,在进行数据插入的时候,bean里面不赋值的话,插入之后该字段依旧是null 是因为hibernate默认插入和更 ...

  9. maven项目部分知识

    1.maven项目在pom.xml中用add dependencies加入jar包,搜索不到jar包的解决方案: Window  --> Show View --> Other输入mave ...

  10. PyCharm 入手第一记

    因为我是忠实的Linux用户,所以一下操作是在Linux下的完成,除了下载,因为Linux的下载着实有点让人捉急. PyCharm 下载地址: http://www.jetbrains.com/pyc ...