187. Repeated DNA Sequences

看到檢測有沒有重復這種,我想了一下還是用了HashMap,其實可以優先用Set的,專門為這種情況設計的,分糖那題就是這樣。
if (map.get(key) == 2)這個操作還是蠻風騷的。
MAP:

    public List<String> findRepeatedDnaSequences(String s) {
        List<String> res = new ArrayList<>();
        HashMap<String, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length() - 9; i++) {
            String key = s.substring(i, i + 10);
            map.put(key, map.getOrDefault(key, 0) + 1);
            if (map.get(key) == 2) {
                res.add(key);
            }
        }
        return res;
    }

SET:

public List<String> findRepeatedDnaSequences(String s) {
    Set seen = new HashSet(), repeated = new HashSet();
    for (int i = 0; i + 9 < s.length(); i++) {
        String ten = s.substring(i, i + 10);
        if (!seen.add(ten))
            repeated.add(ten);
    }
    return new ArrayList(repeated);
}

這題是MEDIUM,所以肯定不能是這種難度,我看了解法,這個題目描述ACGT這種嘌呤嘧啶的DNA真是perfectly match位操作,而且<<左移這種就跟基因檢錄的模型一模一樣。。所以下面有bit manipulation的操作:

public List<String> findRepeatedDnaSequences(String s) {
    Set<Integer> words = new HashSet<>();
    Set<Integer> doubleWords = new HashSet<>();
    List<String> rv = new ArrayList<>();
    char[] map = new char[26];
    //map['A' - 'A'] = 0;
    map['C' - 'A'] = 1;
    map['G' - 'A'] = 2;
    map['T' - 'A'] = 3;

    for(int i = 0; i < s.length() - 9; i++) {
        int v = 0;
        for(int j = i; j < i + 10; j++) {
            v <<= 2;
            v |= map[s.charAt(j) - 'A'];
        }
        if(!words.add(v) && doubleWords.add(v)) {
            rv.add(s.substring(i, i + 10));
        }
    }
    return rv;
}

我發現我容易懼怕,然后就開始磨時間,但實際上一旦懂了其中的原理一下子啥都清楚明了了。
比如這個操作,我一開始看不懂的是for循環里那個<<和|是干嘛的,后來在紙上畫了一下,就發現<<操作就相當于把DNA鏈往左拉2 bits,那么低位自動補0,然后|不是「異或」,而是「或」操作,就自動把讀取到的那一位字母加到后面的integer上了。這樣一共是10 char * 2 bits/char = 20 bits,而Java 里一個Char是4bytes = 32bits。

https://discuss.leetcode.com/topic/8894/clean-java-solution-hashmap-bits-manipulation

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容