Description
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就行了,其中一个map1记录每个单词的频率,然后遍历原字符串,由于单词是固定长度的,所以每次截取固定长度的单词,判断其是否在map1中,如果在,判断其是否有重复,所有第二个map2的作用就来了,用map2来记录其统计我们匹配的每个单词的频率,这样可以判断是否有重复,map2上的每个单词都在map1中,且不重复,这样就可以得到符合要求的子字符串的起始位置。
代码
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> res;
if(s.empty()||words.empty()){
return res;
}
int m=words.size();
int n=words[0].size();
unordered_map<string,int> m1;
for(auto word:words){
m1[word]++;
}
int len=s.length();
for(int i=0;i<=len-m*n;i++){
unordered_map<string,int> m2;
int j=0;
for(;j<m;j++){
string t=s.substr(i+j*n,n);
if(m1.find(t)==m1.end()){
break;
}
m2[t]++;
if(m2[t]>m1[t]){
break;
}
}
if(j==m){
res.push_back(i);
}
}
return res;
}
};
参考文献
[编程题]substring-with-concatenation-of-all-words[LeetCode] Substring with Concatenation of All Words 串联所有单词的子串