这道题如果直接用map来存储子字符串的话会MLE,需要通过将子字符串转成hash只存储从而节省存储空间。
值得注意的一个技巧是,为了避免重复加入元素,我们只有在map中计数为2时才将其加入结果中,这样结果中就不会出现重复元素了。
论坛里大神给出的解决方案如下:
class Solution {
public:
vector<string> findRepeatedDnaSequences(string s) {
unordered_map<size_t,int> MP;
hash<string> hash_fn;
vector<string> ret;
for(int i = 0; i < int(s.size()) - 9; ++i)
if(MP[hash_fn(s.substr(i,10))]++ == 1 )
ret.push_back(s.substr(i,10));
return ret;
}
};
这里的hash函数也可以选择自己实现,论坛里给出了一种实现方法,这种方法在本题的限制下,可以保证不同的长度为10的子串可以产生不同的hash值。
https://leetcode.com/discuss/24478/i-did-it-in-10-lines-of-c