LeetCode——030
2016-04-16 17:15
375 查看
/*
30. Substring with Concatenation of All Words My Submissions QuestionEditorial Solution
Total Accepted: 53094 Total Submissions: 255639 Difficulty: Hard
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).
Subscribe to see which companies asked this question
*/
/*
解题思路:
1.逐一单词遍历。若发现有一个单词存在集合中,则截取以此单词为开头以所有单词总长度为长度的字符串进行判断。
2.判断字符串中是否含有了集合中的所有单词,将截取的字符串分割成等长的子串集合,排序。最后与给定的字符串集合进行比较即可
*/
class Solution { public: vector<int> findSubstring(string s, vector<string>& words) { vector<int> res; sort(words.begin(),words.end()); int n=s.size(),m=words.size(),mm=words[0].size(); for(int i=0;i<n-m*mm+1;i++){ if(find(words.begin(),words.end(),s.substr(i,mm))!=words.end() && isvalid(words,s.substr(i,m*mm))){ res.push_back(i); } } return res; } bool isvalid(vector<string> words,string s){ int n=words[0].size(); vector<string> tmp; for(int i=0;i<s.size();i+=n){ string t=s.substr(i,n); tmp.push_back(t); } sort(tmp.begin(),tmp.end()); return tmp==words; } };
/*
牛人做法:
解题思路:
这道题让我们求串联所有单词的子串,就是说给定一个长字符串,再给定几个长度相同的单词,让我们找出串联给定所有单词的子串的起始位置,还是蛮有难度的一道题。这道题我们需要用到两个哈希表,第一个哈希表先把所有的单词存进去,然后从开头开始一个个遍历,停止条件为当剩余字符个数小于单词集里所有字符的长度。这时候我们需要定义第二个哈希表,然后每次找出给定单词长度的子串,看其是否在第一个哈希表里,如果没有,则break,如果有,则加入第二个哈希表,但相同的词只能出现一次,如果多了,也break。如果正好匹配完给定单词集里所有的单词,则把i存入结果中,具体参见代码如
*/
class Solution { public: vector<int> findSubstring(string s, vector<string>& words) { vector<int> res; if (s.empty() || words.empty()) return res; int n = words.size(), m = words[0].size(); unordered_map<string, int> m1; for (auto &a : words) ++m1[a]; for (int i = 0; i <= (int)s.size() - n * m; ++i) { unordered_map<string, int> m2; int j = 0; for (j = 0; j < n; ++j) { string t = s.substr(i + j * m, m); if (m1.find(t) == m1.end()) break; ++m2[t]; if (m2[t] > m1[t]) break; } if (j == n) res.push_back(i); } return res; } };
相关文章推荐
- SCOJ 4423: Necklace polya
- 显式intent和隐式intent区别
- 编程时遇到的疑惑和解决。
- dock 栏使用技巧(一)添加文件夹快捷方式 空白分隔区 最近使用列表
- java对mysql的增删改查
- navicate for mysql 中文乱码
- centos6.5系统下安装docker新手教程
- 【Leetcode 220】 Contains Duplicate III
- JAVAWEB HTTP协议
- Android Studio调试工具总结
- 深入浅出HTML与XHTML的区别
- c++容器(vector、list、deque)
- Java项目源码学习笔记(三):PathMatcher
- 编译原理的移植[广东话
- tttt
- python学习笔记(time.time方法)
- HDU 1426 Sudoku Killer (回溯 + 剪枝)
- 软件的安装及管理程序
- hihoCoder 1037 数字三角形(基础dp)
- TCP协议中的三次握手和四次挥手(图解)