leetcode 30. Substring with Concatenation of All Words
1456 ワード
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:
You should return the indices:
accepted
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>re;
if (words.empty())
return re;
int wl = words[0].length();
map<string, int>count;
for (int i = 0; i < words.size(); i++)
count[words[i]]++;
int k = 0;
while (true)
{
map<string, int>cnt = count;
while (k < s.length() - wl*words.size() + 1 && cnt.find(string(s.begin() + k, s.begin() + k + wl)) == cnt.end())
k++;
if (k == s.length() - wl*words.size() + 1)
return re;
int kk = k;
while ( !cnt.empty() && cnt.find(string(s.begin() + kk,
s.begin() + kk + wl)) != cnt.end())
{
cnt[string(s.begin() + kk, s.begin() + kk + wl)]--;
if (cnt[string(s.begin() + kk, s.begin() + kk + wl)] == 0)
cnt.erase(cnt.find(string(s.begin() + kk, s.begin() + kk + wl)));
kk += wl;
}
if (cnt.empty())
re.push_back(k);
k++;
}
return re;
}
};
accepted