30. 与所有单词相关联的字串、java实现
题目描述:
给定一个字符串 s 和一些长度相同的单词 words。在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。
示例 1:
输入:
s = "barfoothefoobarman",
words = ["foo","bar"]
输出:
[0,9]
解释: 从索引 0 和 9 开始的子串分别是 "barfoor" 和 "foobar" 。
输出的顺序不重要, [9,0] 也是有效答案。
示例 2:
输入:
s = "wordgoodstudentgoodword",
words = ["word","student"]
输出:
[]
滑动窗口法:
// 参考博客:
// http://www.cnblogs.com/migoo/p/9454684.html
// 用了滑动窗口的方法
public List<Integer> findSubstring(String s, String[] words) {
List<Integer> result = new ArrayList<Integer>();
// 如果s,或者是words为空,那么也返回一个空的列表
if (s.length() == 0 || s == null || words.length == 0 || words == null){
return result;
}
int size = words[0].length(), length = words.length;
// 把字符串数组中的的字符串全部插入HashMap中
HashMap<String, Integer> map = generate(words);
// 窗口的不同的起点,有size个不同的起点
for (int i = 0; i < size; i++){
HashMap<String, Integer> window= new HashMap<>(); // 一个滑动的窗口
int left,right;
left = right = i;
while (right <= s.length() - size && left <= s.length() - length * size){
String word = s.substring(right, right + size);
incr(window, word);
if (!map.containsKey(word)){
window.clear();
right += size;
left = right;
continue;
}
while (window.get(word) > map.get(word)){
String w = s.substring(left, left + size);
decr(window, w);
left += size;
}
right += size;
if (right - left == size * length){
result.add(left);
}
}
}
return result;
}
private HashMap<String, Integer> generate(String[] strs){
HashMap<String, Integer> map = new HashMap<>();
for (String str : strs){
incr(map, str);
}
return map;
}
private void incr(HashMap<String, Integer> map, String str) {
map.put(str, map.getOrDefault(str,0) + 1);
}
private void decr(HashMap<String, Integer> map, String str) {
Integer num = map.get(str);
if (num <= 1){
map.remove(str);
}else {
map.put(str, num - 1);
}
}
暴力法:
// 参考博客
// https://www.nowcoder.com/discuss/87526?type=0&order=0&pos=11&page=0
// 暴力法
public List<Integer> findSubstring(String s, String[] words) {
List<Integer> result = new ArrayList<Integer>();
if (s.length() == 0 || s == null || words.length == 0 || words == null){
return result;
}
int size = words[0].length();
int length = words.length;
// 截取字符串时,取左不取右,所以这里的for循环中i的最大值可以取等号
for (int i = 0; i <= s.length() - size * length; i++){
HashMap<String, Integer> map = new HashMap<>();
for (String word : words){
map.put(word, map.getOrDefault(word, 0) + 1);
}
if (check(s,i,map,size)){
result.add(i);
}
}
return result;
}
private boolean check(String s, int i, HashMap<String, Integer> map, int size) {
if (map.size() == 0){
return true;
}
if (i > s.length() || i + size > s.length()){
return false;
}
String word = s.substring(i, i + size);
if (!map.containsKey(word)){
return false;
}else {
Integer num = map.get(word);
if (num <= 1){
map.remove(word);
}else {
map.put(word, num - 1);
}
return check(s, i + size, map, size);
}
}
30. 与所有单词相关联的字串、java实现的更多相关文章
- [leetcode] 30. 与所有单词相关联的字串(cn第653位做出此题的人~)
30. 与所有单词相关联的字串 这个题做了大概两个小时左右把...严重怀疑leetcode的judge机器有问题.同样的代码交出来不同的运行时长,能不能A题还得看运气? 大致思路是,给words生成一 ...
- Leetcode——30.与所有单词相关联的字串【##】
@author: ZZQ @software: PyCharm @file: leetcode30_findSubstring.py @time: 2018/11/20 19:14 题目要求: 给定一 ...
- LeetCode(30):与所有单词相关联的字串
Hard! 题目描述: 给定一个字符串 s 和一些长度相同的单词 words.在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置. 注意子串要与 words 中的单词完全匹配,中间不能 ...
- [Swift]LeetCode30. 与所有单词相关联的字串 | 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 ...
- 030 Substring with Concatenation of All Words 与所有单词相关联的字串
给定一个字符串 s 和一些长度相同的单词 words,找出 s 与 words 中所有单词(words 每个单词只出现一次)串联一起(words中组成串联串的单词的顺序随意)的字符串匹配的所有起始索引 ...
- Leetcode 30.与所有单词相关联的子串
与所有单词相关联的字串 给定一个字符串 s 和一些长度相同的单词 words.在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置. 注意子串要与 words 中的单词完全匹配,中间不能 ...
- LeetCode--030--串联所有单词的字串(java)
给定一个字符串 s 和一些长度相同的单词 words.找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置. 注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要 ...
- Entity Framework 6 Recipes 2nd Edition(12-5)译 -> 自动删除相关联实体
12-5. 自动删除相关联实体 问题 当一个实体被删除时,你想自动删除它相关联的实体 解决方案 假设你有一个表结构由一个course (科目), course 的classes (课程),以及enro ...
- 报错:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
SqlParameter[] sp = { new SqlParameter("@nGridID",SqlDbType.BigInt), new SqlParameter(&quo ...
随机推荐
- Jmeter_拦截Excel文件输出流到本地
一般而言,对于页面的“导出”操作,主要经历如下两个操作:①根据数据库的内容,将文件导出到应用服务器上:②将服务器上的文件下载到本地电脑: Jmeter同LoadRunner类似,只能记录服务端与客户端 ...
- JavaScript中内置对象的一些属性及方法
Javascript对象总结 JS中内置了17个对象,常用的是Array对象.Date对象.正则表达式对象.string对象.Global对象 Array对象中常用方法: Concat():表示把几个 ...
- Python网络编程(一)
最近在啃<python核心编程(第三版)>,感觉这本书并不是特别的友好,虽然有基于python3提出的改进代码:但是整书的基准感觉还是在python2.7.所以python3的代码中还是有 ...
- Linux系统下强制其他用户下线
强制其他用户下线命令格式:pkill -kill -t tty 解释: pkill -kill -t 强制其他用户下线命令 tty 强制其他用户下线的TTY 如上强制其他用户下线的命令为: pkill ...
- CF213E Two Permutations 线段树维护哈希值
当初竟然看成子串了$qwq$,不过老师的$ppt$也错了$qwq$ 由于子序列一定是的排列,所以考虑插入$1$到$m$到$n-m+1$到$n$; 如何判断呢?可以用哈希$qwq$: 我们用线段树维护哈 ...
- Luogu P4478 [BJWC2018]上学路线 卢卡斯+组合+CRT
首先,从$(0,0)$走到$(n,m)$的方案数是$ C_{n+m}^n$,可以把走的方向看作一种序列,这个序列长$ n+m$ ,你需要从中任取$n$个位置,让他向右走: 然后就是如何处理不能走的点: ...
- spring容器中的beanName
1. 一个类实现多个接口 如下图中的JobService.java, 此时这个beanName=jobService, 没有包名,类名字首字母小写 可以使用下面三种方式获得这个bean IProce ...
- GTY's gay friends 线段树判断区间是否有相同数字
http://acm.hdu.edu.cn/showproblem.php?pid=5172 判断一个区间是否为全排列是: 1.区间总和 = (1 + R - L + 1) * (R - L + 1) ...
- Java微信公众平台开发(十)--微信用户信息的获取
前面的文章有讲到微信的一系列开发文章,包括token获取.菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们有说道微信用户和微信公众账号之间的联系可以通过Openid关 ...
- 为什么我们使用Nginx而不是Apache?
我们大多数的客户在他们的服务器上使用Apache作为Web服务器,尤其是部署在一个基于PHP系统的前端并且使用mod-PHP.鉴于扩张性和性能方面的原因,我们通常会建议他们改用Nginx和FPM. A ...