import java.util.*;

/**
* Source : https://oj.leetcode.com/problems/substring-with-concatenation-of-all-words/
*
* Created by lverpeng on 2017/7/13.
*
* 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).
*
*
* 找出L中单词连接成的子串在字符串S中出现所有位置
*
*/
public class SubstringWithConcatenationOfAllWords { /**
*
* 将strArr中的所有单词放在hash表中,单词为key,相同单词出现的次数为value
*
* strArr中所有单词长度一致,S重要出现所有单词的连接成为的字符串,那么S的长度一定要大于strArr中所有单词的总长度,
* 也就是起始字符在0-(S.length - strArr.length * strArr[0].length)之间,
* 以上面的位置为起始位置,依次判断接下来的strArr.length个单词是否正好是上面hash表中的单词,并判断相同单词出现次数,
* 如果没有出现则退出循环,如果出现的次数大于hash表中单词的次数也break
* 一轮循环完成之后判断循环的次数是否正好是strArr.length,如果是,说明S包含strArr连接的字符串,记录此时的起始位置到结果中
*
* @param S
* @param strArr
* @return
*/
public int[] findSubstring (String S, String[] strArr) {
if (S.length() < 1 | strArr.length < 1) {
return new int[]{};
}
Map<String, Integer> wordMap = new HashMap<String, Integer>(); // 存放strArr单词的哈希表 for (String str : strArr) {
if (wordMap.keySet().contains(str)) {
wordMap.put(str, wordMap.get(str) + 1);
} else {
wordMap.put(str, 1);
}
} int loopCount = 0;
int arrLen = strArr.length;
int wordLen = strArr[0].length();
int arrStrLen = arrLen * wordLen;
List<Integer> result = new ArrayList<Integer>();
for (int i = 0; i < S.length() - arrStrLen; i++) {
int j = 0;
Map<String, Integer> subStrMap = new HashMap<String, Integer>();
for (j = 0; j < arrLen; j++) {
loopCount ++;
String subStr = S.substring(i + j * wordLen, i + j * wordLen + wordLen);
if (!wordMap.keySet().contains(subStr)) {
break;
} else {
if (subStrMap.keySet().contains(subStr)) {
subStrMap.put(subStr, subStrMap.get(subStr) + 1);
} else {
subStrMap.put(subStr, 1);
}
}
if (subStrMap.get(subStr) > wordMap.get(subStr)) {
break;
}
} if (j == arrLen) {
result.add(i);
} }
System.out.println("loopCount------->" + loopCount);
int[] res = new int[result.size()];
for (int i = 0; i < result.size(); i++) {
res[i] = result.get(i);
}
return res;
} /**
* 上面是以步长为1进行循环,下面以步长为word长度进行循环
*
* @param S
* @param strArr
* @return
*/
public int[] findSubstring1 (String S, String[] strArr) {
if (S.length() < 1 || strArr.length < 1) {
return new int[]{};
}
Map<String, Integer> wordMap = new HashMap<String, Integer>();
for (int i = 0; i < strArr.length; i++) {
if (wordMap.keySet().contains(strArr[i])) {
wordMap.put(strArr[i], wordMap.get(strArr[i]));
} else {
wordMap.put(strArr[i], 1);
}
} List<Integer> result = new ArrayList<Integer>();
int wordLen = strArr[0].length();
Map<String, Integer> subStrMap = new HashMap<String, Integer>(); int loopCount = 0;
for (int i = 0; i < wordLen; i++) {
int count = 0;
int left = i; // 记录待匹配子串起始位置
for (int j = i; j < S.length() - wordLen; j += wordLen) {
loopCount ++;
String subStr = S.substring(j, j + wordLen);
if (wordMap.keySet().contains(subStr)) {
if (subStrMap.keySet().contains(subStr)) {
subStrMap.put(subStr, subStrMap.get(subStr) + 1);
} else {
subStrMap.put(subStr, 1);
}
count ++;
if (subStrMap.get(subStr) <= wordMap.get(subStr)) {
count ++;
} else {
// 说明当前开始位置不匹配
while (subStrMap.get(subStr) > wordMap.get(subStr)) {
//
String startWord = S.substring(left, left + wordLen);
subStrMap.put(startWord, subStrMap.get(startWord) - 1);
left += wordLen;
count --;
}
}
if (count == strArr.length) {
// 找到了
result.add(left); // 向后移动一个单词
count --;
String startWord = S.substring(left, left + wordLen);
subStrMap.put(startWord, subStrMap.get(startWord) - 1);
left += wordLen; }
} else {
// 清空变量,重新开始查找
left = j + wordLen;
subStrMap.clear();
count = 0;
}
}
} System.out.println("loopCount------->" + loopCount); int[] res = new int[result.size()];
for (int i = 0; i < result.size(); i++) {
res[i] = result.get(i);
}
return res; } public static void main(String[] args) {
SubstringWithConcatenationOfAllWords substringWithConcatenationOfAllWords = new SubstringWithConcatenationOfAllWords();
String S = "barfoothefoobarman";
String[] strArr = new String[]{"foo", "bar"}; System.out.println(Arrays.toString(substringWithConcatenationOfAllWords.findSubstring(S, strArr)));
System.out.println(Arrays.toString(substringWithConcatenationOfAllWords.findSubstring1(S, strArr)));
} }

leetcode — substring-with-concatenation-of-all-words的更多相关文章

  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] 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 ...

  3. LeetCode:Substring with Concatenation of All Words (summarize)

    题目链接 You are given a string, S, and a list of words, L, that are all of the same length. Find all st ...

  4. [leetcode]Substring with Concatenation of All Words @ Python

    原题地址:https://oj.leetcode.com/problems/substring-with-concatenation-of-all-words/ 题意: You are given a ...

  5. Leetcode Substring with Concatenation of All Words

    You are given a string, S, and a list of words, L, that are all of the same length. Find all startin ...

  6. [LeetCode] Substring with Concatenation of All Words(good)

    You are given a string, S, and a list of words, L, that are all of the same length. Find all startin ...

  7. Leetcode:Substring with Concatenation of All Words分析和实现

    题目大意是传入一个字符串s和一个字符串数组words,其中words中的所有字符串均等长.要在s中找所有的索引index,使得以s[index]为起始字符的长为words中字符串总长的s的子串是由wo ...

  8. LeetCode()Substring with Concatenation of All Words 为什么我的超时呢?找不到原因了!!!

    超时代码 class Solution { public: vector<int> findSubstring(string s, vector<string>& wo ...

  9. LeetCode HashTable 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 ...

  10. leetcode面试准备: Substring with Concatenation of All Words

    leetcode面试准备: Substring with Concatenation of All Words 1 题目 You are given a string, s, and a list o ...

随机推荐

  1. centos 7 安装redis 3.2.1

    https://www.cnblogs.com/zuidongfeng/p/8032505.html 下载安装包: http://download.redis.io/releases/ 根据需要自己选 ...

  2. SQLite 安装

    Windows 平台安装 下载地址:https://www.sqlite.org/download.html 下载预编译的安装包 将下载的安装包=解压到一个文件夹,有三个重要文件: sqlite3.e ...

  3. Effective C++ 笔记:条款 30 inline

    30 : Understand the ins and outs of inlining 1 inline申请书 1.1 类内部实现函数包含隐藏的inline申请 class Human { publ ...

  4. UVaLive 5760 Alice and Bob (博弈 + 记忆化搜索)

    题意:有 n 堆石子,有两种操作,一种是从一堆中拿走一个,另一种是把两堆合并起来,Alice 先拿,谁不能拿了谁输,问谁胜. 析:某些堆石子数量为 1 是特殊,石子数量大于 1 个的都合并起来,再拿, ...

  5. Paper | Batch Normalization

    目录 1. PROBLEM 1.1. Introduction 1.2. Analysis 2. SOLUTION 2.1. Batch Normalization 及其问题 2.2. 梯度修正及其问 ...

  6. 使用Python对Twitter进行数据挖掘(Mining Twitter Data with Python)

    目录 1.Collecting data 1.1 Register Your App 1.2 Accessing the Data 1.3 Streaming 2.Text Pre-processin ...

  7. 团队作业第五周(HCL盐酸队)

    一.Alpha版本测试报告 1.测试计划 测试项目 上下移动   左右移动   发射子弹   与敌方坦克进行攻击 2.测试过程 测试截图 错误记录(提交issues到码云团队项目) 3.测试找出的bu ...

  8. video设置autoplay 不起作用

    video 标签上添加 muted https://blog.csdn.net/taiyangmiaomiao/article/details/80266625

  9. docker,docker-compose部署服务器

    搭建服务器 docker 是一种容器技术,作用是用来快速部署服务,docker-compose 是用来做docker 的多容器控制. 简单的来说:docker-compose即为一种自动化部署服务. ...

  10. 机器学习与Tensorflow(4)——卷积神经网络与tensorflow实现

    1.标准卷积神经网络 标准的卷积神经网络由输入层.卷积层(convolutional layer).下采样层(downsampling layer).全连接层(fully—connected laye ...