滑动窗口处理
原题在这里:
概述题意:
给定一个字符串,找出所有长度为10且出现不止一次的子串。
很常规的hash处理:
class Solution { public: vector<string> findRepeatedDnaSequences(string s) { map<string, int> mp; vector<string> ans; int l = s.length(); for (int i = 0; i < l - 9; ++i) { string x = s.substr(i, 10); mp[x]++; if (mp[x] == 2) ans.emplace_back(x); } return ans; } };
算法复杂度为O(NL)
进阶算法:
hash+滑动窗口+位运算:

讲得太好了,我就直接截图了,算法复杂度为O(N)
思路很巧妙code:
class Solution { const int l = 10; unordered_map<char, int> mp = {{'A', 0}, {'C', 1}, {'G', 2}, {'T', 3}}; public: vector<string> findRepeatedDnaSequences(string s) { vector<string> ans; int n = s.length(); if (n <= l) return ans; int x = 0; for (int i = 0; i < l - 1; ++i) x = (x << 2) | mp[s[i]]; unordered_map<int, int> num; for (int i = 0; i <= n - l; ++i) { //滑动窗口取20位 x = ((x << 2) | mp[s[i + l - 1]]) & ((1 << 20) - 1); if (++num[x] == 2) ans.emplace_back(s.substr(i, l)); } return ans; } };
【Over】

浙公网安备 33010602011771号