[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 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 的所有单词拼接而成,每个单词仅对应地出现一次。
由于 words 里面单词是无序的,目标子字符串的成员单词也是无序的,所以,考虑用 Hashtable 作为数据存储。
需要充分利用的两个题目条件:
1. 所有单词等长
2. 目标子字符串是由单词连续无中断地连接而成
根据上面两个条件,可以将 s 全部分割为长度为 length 的子字符串,共有 length 种分法。length 种分法会覆盖全部需要找的子字符串。
对于每一种分割,可以将长度为 length 的子字符串视为不再分割的单元,利用滑动窗口算法(Slide Window Algorithm),线性时间找到符合条件的目标子字符串,O(n/length) 复杂度,其中 n 为 s 的长度。一共有 length 种分发,则耗时 O(length * n/length) = O(n)。
算法实现思路:
将 s 全部分割为长度为 length 的连续子串的方法,一共有 length 种。
对于每一种 k (0 <= k < length, 表示开始分割的起始下标 ) 有:
以 k 为起始位置,长度为 length 子字符串即为一个待验证子串 subs
左右指针指向首个 subs
若右指针指向的 subs 是要找的 word, 并且已记录的次数小于需要找到的次数,则记录新找到一个 subs,右指针右移
若右指针指向的 subs 是要找的 word,并且已记录的次数等于需要找到的次数, 则将左指针当前单词从记录中排除,并左指针右移,重复此操作直到从记录中排除一个右指针当前的 subs。使得 [ subs 已记录的次数小于需要找到的次数 ]。
若右指针指向的 subs 不是要找的 word,则右指针右移,左指针指向右指针位置,并情况记录。
若已找到的记录(左右指针内元素)恰好等于需要找到全部 words ,则保存左指针所在位置,即为一个需要找的下标。然后,将左指针当前元素从记录中排除,左指针右移。
实现代码:
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set; class Utility{ /**
* reset the value of matched result str_cnt_mch
*
* @param str_cnt_mch
*/
public static void resetHashtable(Hashtable<String, Integer> str_cnt_mch){
Set<Entry<String, Integer>> set = str_cnt_mch.entrySet();
for (Entry<String, Integer> s_c : set){
s_c.setValue(0);
}
}
} public class Solution {
public List<Integer> findSubstring(String s, String[] words) {
List<Integer> res = new LinkedList<Integer>(); Hashtable<String, Integer> str_cnt = new Hashtable<String, Integer>();
Hashtable<String, Integer> str_cnt_mch = new Hashtable<String, Integer>(); for (String wrd : words) {
if (str_cnt.containsKey(wrd)) {
str_cnt.put(wrd, str_cnt.get(wrd) + 1);
} else {
str_cnt.put(wrd, 1);
} str_cnt_mch.put(wrd, 0);
} int length = words[0].length(); for (int k = 0; k < length; k++) { int lft = k;
int rgh = k; Utility.resetHashtable(str_cnt_mch);
int mchCnt = 0; while (rgh + length <= s.length()) { String subs = s.substring(rgh, rgh + length); if (str_cnt.containsKey(subs)) { if (str_cnt_mch.get(subs) < str_cnt.get(subs)) { str_cnt_mch.put(subs, str_cnt_mch.get(subs) + 1);
mchCnt++; rgh += length; } else {
// the number of subs in str_cnt_mch is the same as that
// in str_cnt while (true) { String subsl = s.substring(lft, lft + length); str_cnt_mch.put(subsl, str_cnt_mch.get(subsl) - 1);
mchCnt--; lft +=length; if (subsl.equals(subs)) {
break;
}
}
}
} else {
// subs is not a word in words
Utility.resetHashtable(str_cnt_mch);
mchCnt = 0; rgh = rgh + length;
lft = rgh;
} if (mchCnt == words.length){
res.add(lft); String subsl = s.substring(lft, lft + length);
str_cnt_mch.put(subsl, str_cnt_mch.get(subsl) - 1);
mchCnt--; lft = lft + length;
}
}
} return res;
}
}
参考资料:
Substring with Concatenation of All Words -- LeetCode, Code_Ganker, CSDN
[LeetCode] 30. Substring with Concatenation of All Words 解题思路 - Java的更多相关文章
- LeetCode - 30. Substring with Concatenation of All Words
30. Substring with Concatenation of All Words Problem's Link --------------------------------------- ...
- 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 ...
- 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 ...
- [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 ...
- [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 ...
- LeetCode 30 Substring with Concatenation of All Words(确定包含所有子串的起始下标)
题目链接: https://leetcode.com/problems/substring-with-concatenation-of-all-words/?tab=Description 在字符 ...
- [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 ...
- [Leetcode][Python]30: Substring with Concatenation of All Words
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 30: Substring with Concatenation of All ...
- 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 ...
随机推荐
- html.day01
1.web标准: 1. 结构 (xhtml) 2. 表现(css) 3.行为(js) html 超文本标记语言 xhtml (严格型超文本标记语言) 2.规范: 1. 所有标签(标记)都要 ...
- Android-SVN
服务器启动svn服务 svnserve -d -r /home/wbp/svn/actia/ 1 .svn 重新定位location , 改变新仓库的uuid , 今天操作SVN Client 发现 ...
- get the text value of a selected option.
<select id="myselect"> <option value="1">Mr</option> <optio ...
- c# 使用递归 循环遍历导航树结构 并解析
1.数据书库结构 1 家用电器 0 一级菜单 2 手机.数码.京东通信 0 一级菜单 3 电脑.办公 0 一级菜单 4 家具.家居.厨房 0 一级菜单 5 男装.女装.童装.内衣 0 一级菜单 6 个 ...
- Java方法的参数是按值传递的.【转】
在Java中,所有的方法参数,都是"按值传递". 有那么一种说法,Java中基本类型是按值传递,对象是按引用传递.这个说法其实是不确切的,确切的说法是 Java中基本类型将值作为参 ...
- 【转】 HVTableView创建--展开/折叠列表能 AAShareBubbles社会分享动画组
原文: http://blog.csdn.net/billfanggs/article/details/17279969 HVTableView HVTableView是UITableView(带有展 ...
- JTree用法及JTree使用经验总结
import java.awt.Dimension; import java.awt.Color; import javax.swing.JFrame; import javax.swing. ...
- jQuery图片滑动
一个非常简单实用的jQuery插件 可以用在页面的顶部广告展示 http://slidesjs.com/ 一个需要注意的问题, 就是在手机等客户端(IOS8以上), 使用此插件时, 经常会触发插件的r ...
- win10开始菜单打不开的解决办法
解决方法: 1.在Win10系统下按Win+R打开运行,输入services.msc回车打开服务: 2.在服务中找到User Manager服务;3.打开usermanager服务属性,将其启动类型设 ...
- ORACLE数据库多表关联查询效率问题解决方案
最近在做项目中遇到多表关联查询排序的效率问题(5张以上40W+数据的表),查询一次大概要20多秒,经过一番苦思冥想,处理方案如下: 1.软件设计初期,需要一对一关联的表应该设计在一张大表里,这样虽然字 ...