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. 大熊君大话NodeJS之------Global Objects全局对象

    一,开篇分析 在上个章节中我们学习了NodeJS的基础理论知识,对于这些理论知识来说理解是至关重要的,在后续的章节中,我们会对照着官方文档逐步学习里面的各部分模块,好了该是本文主角登台亮相的时候了,G ...

  2. PHP 线程安全与非线程安全版本的区别深入解析

    Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍 ...

  3. 【Junit】The import org.junit.Test conflicts with a type defined in the same file报错

    引入Junit后,进行单元测试,莫名其妙报了个这样的错误 The import org.junit.Test conflicts with a type defined in the same fil ...

  4. parastor2000挂载方式

    1.先授权 2.客户端安装使用0528parastor-client-centos6.6-38390.tar.xz clusconf -f fatnodes --sync-do "cd /m ...

  5. 【转】(笔记)CANopen协议【CANFestival】移植方法

    一.背景 CAN组网就必须得要应用层协议,原因就在于 * 便于网络管理与控制 * 确认数据的收发 * 发送大于8个字节的数据块(CAN每帧数据传输大小为8字节) * 为不同节点分配不同的报文标识符 * ...

  6. 02快速学习ExtJs之---第一个HelloWord!

    这篇主要讲部署下ExtJS开发环境,以及搭建项目.我们使用ExtJs官方提供的Sencha Cmd来搭建 1.搭建项目 1.下载官方的Sencha Cmd工具,安装. 2..Window用户进入到命令 ...

  7. telnet: connect to address 127.0.0.1: Connection refused

    telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.在终端使用者的电脑上使用telnet程序,用它连接 ...

  8. python del 注意点

    >>> del a[:] >>> a [] del也可以用于删除整个变量: >>> >>> del a 之后再引用名称 a 将会 ...

  9. 1.6---旋转二维数组,旋转图像像素,旋转矩阵,90度(CC150)

    import java.util.*; public class Transform { public int[][] transformImage(int[][] matrix, int n) { ...

  10. MySQL用法

    查询数据库表 通过查询INFORMATION_SCHEMA.TABLES查询数据库表的结构信息 SELECT  *  FROM  INFORMATION_SCHEMA.TABLES WHERE TAB ...