LeetCode187-Repeated DNA Sequenc

2016-05-20  本文已影响32人  胡哈哈哈

思路

hint = ((hint & eraser) << 2) + ati[s[i]];

其中eraser是一个宏定义, 值为0x3ffff, 二进制是00111111111111111111, 用于擦除hint中的最高2位s[i]碱基对应的值, 再左移2, 最后加上s[i+10]的碱基对应的值。

class Solution {
public:
    #define eraser 0x3ffff
    vector<string> findRepeatedDnaSequences(string s) {
        vector<string> answer;
        int hint = 0;//存储长度为10的子串翻译后的int值
        if (s.size() < 10)
            return answer;
        unordered_set<unsigned int> repeated, check;//repeated存储已出现的子串, check用于防止重复答案
        unordered_map<char, unsigned int> ati{{'A', 0}, {'C', 1}, {'G', 2}, {'T', 3}};//此处ati是存储各碱基对应的值00 01 10 11(c++11新语法)
        for (int i = 0; i != 10; ++i) {
            hint = (hint << 2) + ati[s[i]];//用s的前10个碱基构造初始hint值
        }
        repeated.insert(hint);
        for (int i = 10; i != s.size(); ++i) {
            hint = ((hint & eraser) << 2) + ati[s[i]]; //子串变化对应hint值变化
            unordered_set<unsigned int>::iterator it = repeated.find(hint);
            if (it != repeated.end()) {
                it = check.find(hint);
                if (it == check.end()) {
                    answer.push_back(string(s, i - 9, 10));
                    check.insert(hint);
                }
            }
            else
                repeated.insert(hint);
        }
        return answer;
    }
};

一开始由于忽略了移位与其他运算符的优先级关系, 一直出问题,郁闷:(

上一篇下一篇

猜你喜欢

热点阅读