Sliding Window - 30. Substring with Concatenation of All Words
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 starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters.
Example 1:
Input: s = "barfoothefoobarman", words = ["foo","bar"] Output: [0,9] Explanation: Substrings starting at index 0 and 9 are "barfoor" and "foobar" respectively. The output order does not matter, returning [9,0] is fine too.
Example 2:
Input: s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"] Output: []
思路:
利用一个map,单词作为map的key,value是单词在
words
数组中出现的次数。然后去遍历s数组,使用两个指针,一个指针i作为查找单词的起始点,另一个作为单词长度的移动指针,这样在两个指针之间去用另一个哈希表copy来记录相同单词长度的单词和map之间的关系,如果出现map中没有的单词就移动指针i,进行下一轮查找比对。
代码:
java:
class Solution {
/*public List<Integer> findSubstring(String s, String[] words) {
if (s == null || words == null || s.length() == 0 || words.length == 0)
return new ArrayList<>();
List<Integer> res = new ArrayList<>();
int n = words.length, m = words[0].length();
Map<String, Integer> map = new HashMap<>();
// 记录下word中的String的出现次数
for (String str : words) map.put(str, map.getOrDefault(str, 0) + 1);
for (int i = 0; i <= s.length()- n*m; i++) {
HashMap<String, Integer> copy = new HashMap<>(map);
int k = n, j = i;
while(k > 0) {
String str = s.substring(j, j + m);
if (!copy.containsKey(str) || copy.get(str) < 1) break;
copy.put(str, copy.get(str) - 1);
k--;
j += m;
}
if (k == 0) res.add(i);
}
return res;
}*/
public List<Integer> findSubstring(String s, String[] words) {
List<Integer> res = new ArrayList<>();
if (s.length() == 0 || words.length == 0 || s.length() < words.length * words[0].length()) {
return res;
}
int wordsLen = words.length, wlen = words[0].length();
Map<String,Integer> map = new HashMap<>();
// 记录word中单词出现的次数
for(String word : words) map.put(word, map.getOrDefault(word, 0) + 1);
// 从单词每一位开始遍历
for (int i = 0; i < wlen; i++) {
// 然后按照单词的长度一个单词一个单词的寻找
for (int j = i; j <= s.length() - wordsLen * wlen; j +=wlen) {
// 寻找匹配的字串
Map<String,Integer> temp = new HashMap<>();
for (int k = wordsLen - 1; k >= 0; k--) {
String t = s.substring(j + k * wlen, j + (k + 1) * wlen);
int val = temp.getOrDefault(t, 0) + 1;
if (val > map.getOrDefault(t, 0)) {
j += k * wlen; // 如果出现map中没有的单词,就直接从下一个窗口起始点开始寻找
break;
}
temp.put(t, val);
if (k == 0) res.add(j);
}
}
}
return res;
}
}```
- CentOs7.3 ssh 免密登录
- 基础篇章:关于 React Native 之 Touchable 系列组件的讲解
- 基础篇章:关于 React Native 之 Navigator 组件的讲解
- CentOs7.3 搭建 ZooKeeper-3.4.9 单机服务
- Ubuntu 17.04 编译安装 Nginx 1.9.9
- CentOS7.3 安装 iptables 与详细使用
- CentOs7.3 安装 maven3.5
- 基础篇章:关于 React Native 之 Picker 组件的讲解
- Java8的十大新特性你了解多少呢?
- spring 监听器
- ELK 集群 Kibana 使用 X-Pack 权限控制,监控集群状态,实时的生成,警报,监视,cpu,内存,磁盘空间,等等一系列,报告和的可视化图形
- Dubbo详细介绍与安装使用过程
- 基础篇章:关于 React Native之 ActivityIndicator 组件的讲解
- 基础篇章:关于 React Native 之 KeyboardAvoidingView 组件的讲解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- mysql常用语句集合(仅供工作日常学习参考)
- 新一代Notebook神器出现,Jupyter危险了!
- vmstat 监视内存使用情况
- Android开发重写Animation实现下拉图片后弹射回去效果示例
- Android 中RxPermissions 的使用方法详解
- Android构建Material Design应用详解
- Android中DrawerLayout实现侧滑菜单效果
- Android获取系统储存以及内存信息的方法(一)
- Android开发实现读取excel数据并保存为xml的方法
- 详解Kotlin 中使用和配置 Dagger2
- Android开发使用自定义View将圆角矩形绘制在Canvas上的方法
- Android编程双重单选对话框布局实现与事件监听方法示例
- android调用H5显示加载中效果的示例代码
- Java工作中遇到的问题Method has too many Body parameters的处理办法SpringCloud Feign报错:Method has too many Body par
- Android view滑动悬浮固定效果实现代码示例