1. 题目解析
题目链接:30. 串联所有单词的子串 - 力扣(LeetCode)
这道题其实也很好理解,看一下示例就基本知道是什么意思了,
主要就是找 s 里面有没有我们能拼接的子串,然后返回索引即可。
2. 算法原理
我们可以把它给的子串数组中的子串看成一个个字符,
把目标子串 s 中的每一个等长子串也看成一个个字符,
我们就会发现这道题就转化成了之前我们做的那道字母异位词的题目,
我们再使用同样的思路作答即可:
3. 代码编写
class Solution { public: vector<int> findSubstring(string s, vector<string>& words) { vector<int> ret; unordered_map<string, int> win; for(auto& e : words) win[e]++; int len = words[0].size(), m = words.size(); for(int i = 0; i < len; i++) { unordered_map<string, int> hash; for(int left = i, right = i, count = 0; right + len <= s.size(); right += len) { string in = s.substr(right, len); hash[in]++; if(hash[in] <= win[in]) count++; if(right - left + 1 > len * m) { string out = s.substr(left, len); if(hash[out] <= win[out]) count--; hash[out]--; left += len; } if(count == m) ret.push_back(left); } } return ret; } };
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。
如果感到有所收获的话可以给博主点一个赞哦。
如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~