Repeated DNA Sequences

来源:互联网 发布:c语言getchar和scanf 编辑:程序博客网 时间:2024/06/04 00:41
View Code

hash table plus bit manipulation method

(view the Show Tags and Runtime 10ms !)

算法分析

首先考虑将ACGT进行二进制编码

A -> 00

C -> 01

G -> 10

T -> 11

在编码的情况下,每10位字符串的组合即为一个数字,且10位的字符串有20位;一般来说int有4个字节,32位,即可以用于对应一个10位的字符串。例如

ACGTACGTAC -> 00011011000110110001

AAAAAAAAAA -> 00000000000000000000

20位的二进制数,至多有2^20种组合,因此hash table的大小为2^20,即1024 * 1024,将hash table设计为bool hashTable[1024 * 1024];

遍历字符串的设计

每次向右移动1位字符,相当于字符串对应的int值左移2位,再将其最低2位置为新的字符的编码值,最后将高2位置0。例如

src CAAAAAAAAAC

subStr CAAAAAAAAA

int 0100000000

subStr AAAAAAAAAC

int 0000000001

时间复杂度

字符串遍历O(n),hash tableO(1);总时间复杂度O(n)

public class Solution {
    public List<String> findRepeatedDnaSequences(String s) {
        List<String> result = new ArrayList<String>();
        if(s == null || s.length() < 10) return result;
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        Integer val = 0;
        for(int i = 0; i < 10; i ++){
            val = val << 2;
            val |= toInt(s.charAt(i));
        }
        map.put(val, 1);
        for(int i = 10; i < s.length(); i ++){
            val = ((val & 0x3ffff) << 2) | toInt(s.charAt(i));
            if(map.containsKey(val)) map.put(val, map.get(val) + 1);
            else map.put(val, 1);
        }
        for(Integer v : map.keySet())
            if(map.get(v) > 1) result.add(toDNA(v));
        return result;
    }
    
    private Integer toInt(char c){
        if(c == 'A') return 0;
        else if(c == 'C') return 1;
        else if(c== 'G') return 2;
        else return 3;//T
    }
    
    private String toDNA(Integer i){
        StringBuilder sb = new StringBuilder();
        for(int j = 0; j < 10; j ++){
            int tmp = i % 4;
            i = i / 4;
            char c = 'T';
            if(tmp == 0) c = 'A';
            else if(tmp == 1) c = 'C';
            else if(tmp == 2) c ='G';
            sb.insert(0, c);
        }
        return sb.toString();
    }
}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 牙齿塞药掉了怎么办啊 补牙后按压疼痛怎么办 补过的牙齿疼怎么办 堵完牙后牙涨疼怎么办 补牙到牙神经怎么办 想换飘窗窗户 大理石面怎么办 出差三个月绿萝怎么办 口红吊兰根烂怎么办 金鱼吊兰干枝怎么办 口红吊兰不开花怎么办 单位上班座位不好怎么办 简易办公室夏天闷热怎么办 开发商不让用公积金贷款怎么办 夏天脚底开裂缝怎么办 晚上脚丫子痒怎么办丫 栀子花长白粉虱怎么办 栀子花花骨朵变黄怎么办 栀子花苞焉了怎么办 水培栀子花焉了怎么办 三角梅叶子焉了怎么办 换瓣手术后出现漏洞怎么办 牙2瓣了怎么办 二件瓣反流已有20多年了怎么办 小阴唇静脉畸形怎么办 帝舵手表氧化怎么办? 脸干不易吸收怎么办 水粉画颜料裂了怎么办 吃粉条胃不舒服怎么办 胃营养吸收不好怎么办 猫咪老是挠人怎么办 去水上乐园头发怎么办 小腿摔伤后肿痛怎么办 对于说脏话学生怎么办 我该怎么办表情包 快乐暑假的板报怎么办 门前种了柏树怎么办 屁股两边长湿疹怎么办 小鸡发呆不吃食怎么办 脸上长小红豆怎么办 ps衣服褶皱太多怎么办 青菜根部长瘤怎么办