滑动窗口处理

原题在这里:

概述题意:

  给定一个字符串,找出所有长度为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】

posted @ 2022-03-23 17:44  Renhr  阅读(44)  评论(0)    收藏  举报