赞
踩
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).
给一个字符串 S 和一个单词列表,单词长度都一样,找出所有 S 的子串,子串由所有单词组成,返回子串的起始位置。
很明显每个子串都是由所有单词组成的,长度是一定的,所以直接枚举子串,切分后再用 map 进行判断就行了。
实现代码:
class Solution {
public:
vector<int> findSubstring(string S, vector<string> &L) {
map<string, int> words;
map<string, int> curWords;
vector<int> ret;
int slen = S.length();
if (!slen || L.empty()) return ret;
int llen = L.size(), wlen = L[0].length();
for(int i=0;i<L.size();i++) //计算字符串对应的key值
++words[L[i]];
// check the [llen * wlen] substring
for (int i = 0; i + llen * wlen <= slen; i++)
{
curWords.clear();
int j = 0;
// check the words
for (j = 0; j < llen; j++)
{
string tmp = S.substr(i + j * wlen, wlen);
if (words.find(tmp) == words.end())
break;
++curWords[tmp];
if (curWords[tmp] > words[tmp]) //防止S中重复单词出现
break;
}
if (j == llen) //从i位置已经找到了L中的单词;
ret.push_back(i);
}
return ret;
}
};
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。