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 starting indices of substring(s) in s that is a concatenation of each word in words exactly 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). (Hard)
分析:
题目意思是找到所有起始位置,使得往后的若干连续字符组成的字符串 的正好是集合中所有元素组成的字符串。
自己考虑到的还是一个暴力的做法,没有超时,写起来也没那么容易。
大致思路是建一个hash存放words不同元素出现在words中的次数(开始只存放有无,后来发现words中元素可重复)
然后对s进行遍历,从每个位置开始,依次取len长度的字符串,与hash中的值比较。根据在不在hash内进行跳出循环,hash[words[j]]--等操作.
到words.size() -1 长度自然跳出循环,说明完全匹配,可以将这个i加入结果。
代码:
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
int len = words[].size();
unordered_map<string, int> count;
vector<int> result;
if (s.size() < words.size() * len) {
return result;
}
for (int k = ; k < words.size(); ++k) {
if (count.find(words[k]) == count.end()) {
count[words[k]] = ;
}
else {
count[words[k]] ++;
}
}
unordered_map<string, int> save = count;
for (int i = ; i <= s.size() - words.size() * len; i++) {
int flag = ;
for (int j = i; j < i + words.size() * len ; j += len) {
string temp = s.substr(j, len);
if (count.find(temp) != count.end()) {
if (count[temp] > ) {
count[temp]--;
}
else {
flag = ;
break;
}
}
else {
flag = ;
break;
}
}
if (flag == ) {
result.push_back(i);
}
count = save;
}
return result;
}
};
8月19日更新:
对于自己的实现中,每次更新i都需要拷贝一次hash表。
可以换一种方式,一个hash作为基准在循环前准备好。然后对于每个i生成一个新的hash,添加元素进去,与老的比较,比拷贝应该效率要高。
其他注意事项:
1. words.size(),s.size()都是unsigned int,所以做减法之后不会出现 -1,所以导致由此限定循环有问题,所以自己在前面加了一个
if (s.size() < words.size() * len)
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
int len = words[].size();
unordered_map<string, int> count;
vector<int> result;
for (int k = ; k < words.size(); ++k) {
count[words[k]]++;
}
//s.size() - words.size() * len 结果是个unsigned;
int n = s.size(), m = words.size();
for (int i = ; i <= n - m * len; i++) {
unordered_map<string, int> hash;
int flag = ;
for (int j = i; j < i + words.size() * len ; j += len) {
string temp = s.substr(j, len);
hash[temp]++;
if (hash[temp] > count[temp]) {
flag = ;
break;
}
}
if (flag == ) {
result.push_back(i);
}
}
return result;
}
};
好像还有个滑动窗口的解法,回头头脑清楚再研究...
LeetCode30 Substring with Concatenation of All Words的更多相关文章
- 【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 ...
- LeetCode - 30. Substring with Concatenation of All Words
30. Substring with Concatenation of All Words Problem's Link --------------------------------------- ...
- 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 ...
- [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 sta ...
- [Leetcode][Python]30: Substring with Concatenation of All Words
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 30: Substring with Concatenation of All ...
- leetcode-algorithms-30 Substring with Concatenation of All Words
leetcode-algorithms-30 Substring with Concatenation of All Words You are given a string, s, and a li ...
- 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 ...
- 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 ...
- 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 ...
随机推荐
- windows下python的包管理器pip安装
pip: A tool for installing and managing Python packages. 要用到第三方包,python的版本就必须是2.7 https://pypi.pyth ...
- ubuntu 64位系统下加速Android模拟器
安装KVM: sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils 在Postfix Configurati ...
- JS初识(着重讲解Date函数)
查看类型:typeof() 转换为int类型:parseInt() isNaN() 函数用于检查其参数是否是非数字值. NaN,是Not a Number的缩写.一种计算机用语.NaN 用于处理计算中 ...
- Unable to load dll 的解决方案
前几天在做项目时,需要用到一个非托管的 dll 库,其实使用 .Net 的互操作技术可以很方便地调用非托管 dll 文件中的函数,但是在执行时出现了“Unable to load dll HRESUL ...
- Java垃圾回收器
一.Java垃圾回收器要负责完成以下3个任务: 1.分配内存 2.确保被引用对象的内存不被错误回收 3.回收不再被引用的对象的内存空间 二.垃圾回收是一个复杂而又耗时的操作.如果JVM花费过多的时间在 ...
- [转] 一个程序猿眼中的国内主流地图api
在网站或者手机应用中,经常用到地图api.在现在这么激烈的竞争下,各地图服务提供的服务基本都趋于一致了.一个公司推出的新服务,其他公司肯定也会很快的跟进.这样,对于开发者来说,地图api的选择就主要参 ...
- 为什么要尽量少使用iframe
Iframes 阻塞页面加载 及时触发 window 的 onload 事件是非常重要的.onload 事件触发使浏览器的 “忙” 指示器停止,告诉用户当前网页已经加载完毕.当 onload 事件加载 ...
- 如何在微博侧栏中加入自己的微博[js]
<div class="box"> <ul> <li> <object classid="clsid:D27CDB6E-AE6D ...
- 通过javascript完成分页查询功能
主要思路: 实现分页查询的关键是设置一个页面的最大数据行数和开始行号,代码如下: 最大行数我们设置为常量,不必纠结于他,所以关键就是如何把起始行号设置为变量,让他随着我们点击[上一页]或[下一页]而改 ...
- js ajax上传图片到服务器
$("#up_goods_pic").on('change',function(){ var file = this.files[0]; var url = webkitURL.c ...