一.问题描述
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).
二.我的解题思路
对字符串s进行遍历,s中每一个字符都有可能是符合条件的子串的开始。建立hash表来减小时间复杂度。测试通过的程序如下:
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
int word_num=words.size();
int word_len = words[0].length();
int len = s.length();
map<string,int> src_hash_map;
vector<int> res;int flag=0;
//generate src_hash_map
for(int i=0;i<word_num;i++){
src_hash_map[words[i]]++;
}
for(int i=0;i<len;i++){
map<string,int> tmp_map;
for(int j=0;j<word_num;j++){
string curr("");
for(int k=0;k<word_len;k++){
if(i+j*word_len+k>=len)
return res;
curr += s[i+j*word_len+k];
}
if(src_hash_map[curr]<1)
break;
else
tmp_map[curr]++;
}
for(int k=0;k<word_num;k++){
if(src_hash_map[words[k]]!=tmp_map[words[k]]){
flag=1;
break;
}
}
if(flag==1)
flag=0;
else
res.push_back(i);
}
return res;
}
};
注意需要对边界条件进行判断:
if(i+j*word_len+k>=len)
return res;
否则会超时