【LeetCode187】-重复的DNA序列

方法一

实现思路

这种实际上是一种暴力求解的思想,从头到尾开始遍历所有长度为10的子串,在这个过程中利用map不断记录出现的子串的次数,最后遍历map中的结果,将统计的数目超过1的压入最终的字符数组中

实现代码

class Solution {
    
    
public:
    vector<string> findRepeatedDnaSequences(string s) {
    
    
        map<string,int> cnt;
        vector<string> re;
        if(s.length()<=10) return re;
        for(int i=0;i<=s.length()-10;i++){
    
    
            string st=s.substr(i,10);
            if(!cnt.count(st))
                cnt[st]=1;
            else
                cnt[st]++;
            
        }
        map<string,int>::iterator it;
        for(it=cnt.begin();it!=cnt.end();it++){
    
    
            if(it->second>1)
            re.push_back(it->first);
        }
        return re;
    }
};

提交结果及分析

在这里插入图片描述
这里面主要是遍历字符串,遍历所有字符串应该大致为O(n)

方法二

实现思路

在这里插入图片描述在映射的时候,不使用字符串映射使用整数映射
在这里插入图片描述将数组开到class中占用的是栈的内存
4个字符构成的长度为10的序列的排列组合个数为:410=220=1048576

实现代码

在这里插入图片描述
这里面容易混乱的原因是在于,在计算和的时候其实是将2进制的移动和10进制的运算弄在一起了

在计算的时候不去想那么多,虽然我们在程序中体现的是10进制的编码1,2,3,4,但其实在实际的运算中计算机内部会按照左移右移来按照二进制的规则来运算的

Q:&3为什么能得到后两位的结果
**A:**原因在于3的二进制除了最后两位是1,其他高位均为0,所以和3相与只会得到后两位的结果

总结

第二种方式由于使用来位运算,确实速度会提升的

猜你喜欢

转载自blog.csdn.net/weixin_44944046/article/details/115186647