【题目】
You are given a string, S, and a list of words, L, that are all of the same length. Find all starting indices of substring(s) in S that is a concatenation of each word in L exactly once and without any intervening characters.
For example, given:
S: "barfoothefoobarman"
L: ["foo", "bar"]
You should return the indices: [0,9]
.
(order does not matter).
【分析】
先用map<string,int>统计L中每个单词的个数(L中单词可能会重复)。
从第一个字符开始遍历,对于第i个字符,由它开始和L中单词匹配,如果不匹配,跳到第i+1字符继续匹配。
【代码】
/*********************************
* 日期:2015-01-25
* 作者:SJF0115
* 题目: 30.Substring with Concatenation of All Words
* 网址:https://oj.leetcode.com/problems/substring-with-concatenation-of-all-words/
* 结果:AC
* 来源:LeetCode
* 博客:
**********************************/
#include <iostream>
#include <vector>
#include <map>
using namespace std;
class Solution {
public:
vector<int> findSubstring(string S, vector<string> &L) {
int strLen = S.length();
int size = L.size();
int wordLen = (L[0]).length();
vector<int> result;
if(strLen <= 0 || size <= 0){
return result;
}//if
map<string,int> words;
// word count
for(int i = 0;i < size;++i){
++words[L[i]];
}//for
map<string,int> curMap = words;
// 遍历寻找
for(int i = 0;i <= strLen - size*wordLen;++i){
curMap = words;
// 从位置i寻找words
for(int j = 0;j < size;++j){
string substr = S.substr(i+j*wordLen,wordLen);
// 不匹配
if(words.find(substr) == words.end()){
break;
}//if
--curMap[substr];
if(curMap[substr] < 0){
break;
}//if
// 一个匹配项
if(j == size-1){
result.push_back(i);
}//if
}//for
}//for
return result;
}
};
int main(){
Solution solution;
string s("barfoothefoobarman");
vector<string> vec;
vec.push_back("foo");
vec.push_back("bar");
vector<int> result = solution.findSubstring(s,vec);
// 输出
for(int i = 0;i < result.size();++i){
cout<<result[i]<<endl;
}//for
return 0;
}