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 ...
随机推荐
- ubuntu设置nginx为系统服务
ubuntu设置nginx为系统服务,如果没有设置为系统服务,无法执行 sudo service nginx startsudo service nginx stop 设置为系统服务命令 sudo u ...
- sql数据库发布、订阅同步方式操作
Sql数据库发布订阅分为两个步骤:1.发布.2.订阅.首先在数据源数据库服务器上对需要同步的数据进行发布,然后在目标数据库服务器上对上述发布进行订阅. 一.发布. 发布需要用实际的服务器名称,不能使用 ...
- android 缓存路径
用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的.大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中.这样当该应用被卸载后,这些数据还保 ...
- ELK(ElasticSearch, Logstash, Kibana) v5.3.2 分布式日志收集分析最佳解决方案 基于CentOS 7 ( 一 )
[root@localhost temp]# .tar.gz -C /usr/local/ [root@localhost temp]# vim logstatsh_test.conf ======= ...
- redis数据类型--个人常规用法
一.String 1.可以容纳最高512M的value. 2.经常用于通过expire来实现自动过期的一些值,直接通过setex 来. 3.通过incrby的方式,来实现value值得增长. 4.执行 ...
- 用CSS控制图片大小显示的方法
图片自动适应大小是一个非常常用的功能,在进行制作的时候为了防止图片撑开容器而对图片的尺寸进行必要的控制,我们可不可以用CSS控制图片使它自适应大小呢? 可以通过按比例缩小或者放大到某尺寸(自己指定), ...
- sql server sql语句
添加联合唯一索引 create unique index 索引名 on 表名(列名1,列名2……)
- 查看Apache信息以用户htdoc位置
查看Apache的相关信息:httpd -V 再从基本信息中取得DocumentRoot位置 less /etc/httpd/httpd.conf中查找DocumentRoot,即有静态文件存放的位置 ...
- python协程与异步协程
在前面几个博客中我们一一对应解决了消费者消费的速度跟不上生产者,浪费我们大量的时间去等待的问题,在这里,针对业务逻辑比较耗时间的问题,我们还有除了多进程之外更优的解决方式,那就是协程和异步协程.在引入 ...
- Invoke 和 BeginInvoke 的区别(转发)
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate. 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是do ...