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).
采用滑动窗口的思想进行实现。
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> result;
if(s.empty() || !words.size() || s.length() < words[0].length()){
return result;
}
//为words向量建立Hash表
int nVecLen = words.size();
unordered_map<string, int> wordMap;
for(int i = 0; i < nVecLen; i++){
wordMap[words[i]]++;
}
//线性遍历字符串s
unordered_map<string, int> curMap;
int nWordLen = words[0].length();
int nCount = 0;
int nWinStart = 0, nWinEnd = 0;
for(int k = 0; k < nWordLen; k++){
curMap.clear();
nCount = 0;
nWinStart = k;
for(nWinEnd = k; nWinEnd <= s.length() - nWordLen; nWinEnd += nWordLen){
string str = s.substr(nWinEnd, nWordLen);
if(wordMap.count(str) <= 0){
curMap.clear();
nCount = 0;
nWinStart = nWinEnd + nWordLen;
}else{
curMap[str]++;
nCount++;
if(curMap[str] <= wordMap[str]){
if(nCount == nVecLen){
result.push_back(nWinStart);
string leftStr = s.substr(nWinStart, nWordLen);
curMap[leftStr]--;
nCount--;
nWinStart += nWordLen;
}
}else{
string leftStr = s.substr(nWinStart, nWordLen);
while(leftStr != str){
nWinStart += nWordLen;
curMap[leftStr]--;
nCount--;
leftStr = s.substr(nWinStart, nWordLen);
}
nWinStart += nWordLen;
curMap[leftStr]--;
nCount--;
}
}
}
}
return result;
}
};