您的位置:首页 > 其它

leetcode:Substring with Concatenation of All Words

2015-08-20 16:32 447 查看
Substring with Concatenation of All Words

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和一个字符串数组L,L中的字符串长度都相等,找出S中所有的子串,该子串恰好包含L中所有字符各一次并且不含其他字符,返回所有这样子串的起始位置。

分析

把字符串数组L建一个Map字符窗,将字符窗从字符串S的第一个字符开始匹配并向后滑动,直到S的最后一个字符,输出匹配结果。

C++11代码

// 时间复杂度O(n*m),空间复杂度O(m)
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& dict) {
size_t wordLength = dict.front().length();
size_t catLength = wordLength * dict.size();
vector<int> result;
if (s.length() < catLength) return result;
unordered_map<string, int> wordCount;
for (auto const& word : dict){
++wordCount[word];
}
for (auto i = begin(s); i <= prev(end(s), catLength); ++i) {
unordered_map<string, int> unused(wordCount);
for (auto j = i; j != next(i, catLength); j += wordLength) {
auto pos = unused.find(string(j, next(j, wordLength)));
if (pos == unused.end() || pos->second == 0) break;
if (--pos->second == 0) unused.erase(pos);
}
if (unused.size() == 0) result.push_back(distance(begin(s), i));
}
return result;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: