题目:

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

For example, given:

s: "barfoothefoobarman"

words: ["foo", "bar"]

You should return the indices: [0,9].

(order does not matter).

题意:

给定一个字符串s,
和一组字符串数组words,数组中的全部字符串长度都一样。从字符串s中找出全部子串的開始标号。这些子串是words中全部字符串的组合。而且每一个字符串仅仅出现一次且没有其它字符插入他们之间,这些字符串的排列顺序无所谓。

算法分析:

方法一:

*  由于L中全部单词的长度是一样的。这样依据wordLen。能够将S分为wordLen组,实际意思是这种。

*  以题目中barfoothefoobarman举例,L中单词长度为3。能够分为

*  bar|foo|the|foo|bar|man

*  ba|rfo|oth|efo|oba|rma|n

*  b|arf|oot|hef|oob|arm|an

*  这样。针对每一个分组,能够利用最小滑动窗体的思想,高速的推断是否包括须要的字符串。

*  直观上来看,是须要从每一个字符開始搜索,实际上,利用两个指针去在S中寻找满足条件的字符串,并且是每次+wordLen。并且不会反复的去统     *  计。节省

*  了非常多时间。

方法二:

思路仍然是维护一个窗体。如果当前单词在字典中,则继续移动窗体右端。否则窗体左端能够跳到字符串下一个单词了。如果源字符串的长度为n。字典中单词的长度为l。由于不是一个字符。所以我们须要对源字符串全部长度为l的子串进行推断。

每次按顺序在源字符串中截取和字典中全部字符串长度相等的长度,推断新截取的子串和字典中字符串是否匹配,匹配就增加到结果中。不匹配就依次继续在源字符串中截取新的子串。反复上述过程直到结束。

AC代码:

方法一:
<span style="font-size:12px;">public class Solution
{
public ArrayList<Integer> findSubstring(String S, String[] L)
{
ArrayList<Integer> list = new ArrayList<Integer>();
int len = L.length;
if (len == 0)
return list; int wordLen = L[0].length();
Map<String, Integer> wordsMap = new HashMap<String, Integer>();
for (int i = 0; i < len; i++)
{
int num = 1;
if (wordsMap.get(L[i]) != null)
num += wordsMap.get(L[i]);
wordsMap.put(L[i], num);
}
int slen = S.length();
int max = slen - wordLen + 1;
for (int i = 0; i < wordLen; i++)
{
Map<String, Integer> numMap = new HashMap<String, Integer>();
int count = 0;
int start = i;
for (int end = start; end < max; end += wordLen)
{
String tempStr = S.substring(end, end + wordLen);
if (!wordsMap.containsKey(tempStr))//给定字符串数组中不包括当前的字符串,直接跳到下一个字符串
{
numMap.clear();
count = 0;
start = end + wordLen;
continue;
} int num = 1;
if (numMap.containsKey(tempStr))
num += numMap.get(tempStr);
numMap.put(tempStr, num); if (num <= wordsMap.get(tempStr))
count++;//仅仅有在小于给定数组元素个数的情况下才自加
else
{
while (numMap.get(tempStr) > wordsMap.get(tempStr))
{
tempStr = S.substring(start, start + wordLen);//在如今的map尾部中出现大于给定数组元素个数的情况是时,去除map头部元素
numMap.put(tempStr, numMap.get(tempStr) - 1);
if (numMap.get(tempStr) < wordsMap.get(tempStr))
count--;//去除了元素了。个数自来就少了一个 start += wordLen;//相应的起始元素也往后移动了一个
}
}
if (count == len)
{
list.add(start);
tempStr = S.substring(start, start + wordLen);//满足条件后去除头个元素,也就是又一次后移一个位置,看看后面的满足条件不
numMap.put(tempStr, numMap.get(tempStr) - 1);
count--;
start += wordLen;
}
}
}
return list;
}
}</span>

方法二:

public class Solution
{
public List<Integer> findSubstring(String S, String[] L)
{
List<Integer> result=new ArrayList<Integer>();
if(L.length==0||S.length()==0) return result;
int wordlen=L[0].length();
//map中存放L
HashMap<String,Integer> map=new HashMap<String,Integer>();
for(int i=0;i<L.length;i++)
{
Integer value=map.get(L[i]);
if(value==null)
value=1;
else
value+=1;
map.put(L[i],value);
} for(int i=0;i+wordlen<=S.length();i++)
{
if(i + wordlen * L.length > S.length())
{
break;
}
if(map.containsKey(S.substring(i,i+wordlen)))
{
boolean b=checkString(S.substring(i,i+wordlen*L.length),new HashMap<String,Integer>(map),wordlen);
if(b==true)
result.add(i);
} }
return result;
} //检查字符串S是不是map中字符串的组合
public boolean checkString(String s,HashMap<String,Integer> map,int wordlen)
{
boolean flag=true;
int i=0;
while(s.length()>0)
{
String temp=s.substring(0,wordlen);
Integer value=map.get(temp);
if(value==null||value==0)
{
flag=false;
break;
}else{
value-=1;
map.put(temp,value);
s=s.substring(wordlen);//该子字符串从指定索引处的字符開始,直到此字符串末尾。
} }
return flag;
}
}

[LeetCode][Java] Substring with Concatenation of All Words的更多相关文章

  1. [LeetCode] 30. Substring with Concatenation of All Words 解题思路 - Java

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

  2. leetCode 30.Substring with Concatenation of All Words (words中全部子串相连) 解题思路和方法

    Substring with Concatenation of All Words You are given a string, s, and a list of words, words, tha ...

  3. 【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 ...

  4. LeetCode - 30. Substring with Concatenation of All Words

    30. Substring with Concatenation of All Words Problem's Link --------------------------------------- ...

  5. LeetCode 030 Substring with Concatenation of All Words

    题目要求:Substring with Concatenation of All Words You are given a string, S, and a list of words, L, th ...

  6. Java for LeetCode 030 Substring with Concatenation of All Words【HARD】

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

  7. Java [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 a ...

  8. LeetCode 30 Substring with Concatenation of All Words(确定包含所有子串的起始下标)

    题目链接: https://leetcode.com/problems/substring-with-concatenation-of-all-words/?tab=Description   在字符 ...

  9. [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 ...

随机推荐

  1. python数据库编程_sqlite

    原文请看:http://blog.csdn.net/jj_liuxin/article/details/3584448 sqlite是一个轻量级的数据库,与很多大型的数据库(例如DB2,Oracle, ...

  2. Codeforces 1099 A. Snowball-暴力(Codeforces Round #530 (Div. 2))

    A. Snowball time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  3. Attacking JavaScript Engines: A case study of JavaScriptCore and CVE-2016-4622(转)

    转:http://phrack.org/papers/attacking_javascript_engines.html Title : Attacking JavaScript Engines: A ...

  4. leetcode104 Maximum Depth

    题意:二叉树最大深度 思路:递归,但是不知道怎么回事直接在return里面计算总是报超时,用俩变量就可以A···奇怪,没想通 代码: int maxDepth(TreeNode* root) { if ...

  5. 【SPOJ Query on a tree 】 (树链剖分)

    http://acm.hust.edu.cn/vjudge/problem/13013 题意: 有一棵N个节点的树(1<=N<=10000),N-1条边,边的编号为1~N-1,每条边有一个 ...

  6. 浅谈js对象及对象属性

    对象: ECMA-262把对象定义为 :无序属性的集合,其属性可以包含基本值,对象或者函数. 严格来讲,这就相当于说对象是一组没有特定顺序的值.对象的每一个属性或方法都有一个名字,而每个名字都映射到一 ...

  7. Codeforces Round #343 (Div. 2) B. Far Relative’s Problem 暴力

    B. Far Relative's Problem 题目连接: http://www.codeforces.com/contest/629/problem/B Description Famil Do ...

  8. CentOS 6.9下KVM虚拟机快照创建、删除、恢复(转)

    使用文件快照的方式实现文件备份,但单说快照(snapshot)的话,他是某一时间点(版本)你能看到的该时间点备份文件状态的全貌,通过文件的快照(全貌)你能恢复到特定时间点(版本)的文件状态. 创建虚拟 ...

  9. httpWebRequest 文件下载

    服务版本: go file system ssdb github: https://github.com/dtxlink/gfs 上一篇: 一个 go 文件服务器 ssdb 通过 httpWebReq ...

  10. 最佳实践: 勿在 Servlet 中实现 SingleThreadModel

    摘要 请不要实现 SingleThreadModel 接口.这种实践将导致 Web 容器创建多个 servlet 实例:即为每个用户创建一个实例.对于任何大小的应用程序,这种实践都将导致严重的性能问题 ...