今天是被这道题摁着锤,先说说我最开始得想法,第一个是把所有得子串都求出来,写代码得时候不知道怎么做,后面想了个另外得方法,就是匹配,找出一个窗口,按顺序取出来,跟vector对比,发现这样如果出现一样得单词,那不是歇菜了。。。
今天想了很久,还是只能求助解题,主要是看官方的,官方的解题和我窗口的想法类似,不过他是按照单词的频次来匹配,天才呀。这样就不用管vector里面的内容了,只需要频次对的上就行。不过一开始这个代码,看到有点懵,也是看了很久。
class Solution {
public:
vector<int> findSubstring(string &s, vector<string> &words) {
vector<int> res;
int m = words.size(), n = words[0].size(), ls = s.size();
for (int i = 0; i < n && i + m * n <= ls; ++i) {
unordered_map<string, int> differ;
for (int j = 0; j < m; ++j) {
++differ[s.substr(i + j * n, n)];
}
for (string &word: words) {
if (--differ[word] == 0) {
differ.erase(word);
}
}
for (int start = i; start < ls - m * n + 1; start += n) {
if (start != i) {
string word = s.substr(start + (m - 1) * n, n);
if (++differ[word] == 0) {
differ.erase(word);
}
word = s.substr(start - n, n);
if (--differ[word] == 0) {
differ.erase(word);
}
}
if (differ.empty()) {
res.emplace_back(start);
}
}
}
return res;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/substring-with-concatenation-of-all-words/solutions/1616997/chuan-lian-suo-you-dan-ci-de-zi-chuan-by-244a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这里就说说我自己的想法吧!!!!
他是利用了一个哈希表,c++里面是unordered_map,这是类似python字典的东西,是个键值对。来统计单词出现的频次。官方是将s中出现的,+1,words里面的,-1.这样来统计s窗口和words之间的频次差。
后面就是滑动窗口了。最后如果频次差为0,就说明匹配了,把start加到res结果中,最后输出结果。
这个题目这么说呢,看了答案,感觉蛮简单的,主要是频次差这个想法,不存在我的脑子里。当然这个或许熟能生巧之后会。可以想到这个解题方案吧。加油吧!!!!