0
点赞
收藏
分享

微信扫一扫

[leetcode] 30. Substring with Concatenation of All Words


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 串联所有单词的子串​​


举报

相关推荐

0 条评论