LeetCode-187-重複的DNA序列

雄獅虎豹發表於2022-05-02

重複的DNA序列

題目描述:所有 DNA 都由一系列縮寫為 'A','C','G' 和 'T' 的核苷酸組成,例如:"ACGAATTCCG"。在研究 DNA 時,識別 DNA 中的重複序列有時會對研究非常有幫助。

編寫一個函式來找出所有目標子串,目標子串的長度為 10,且在 DNA 字串 s 中出現次數超過一次。

示例說明請見LeetCode官網。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:雜湊

首先,判斷特殊情況,如果字串的長度小於11,說明不夠組成一個目標子串,不可能有重複的序列,直接返回空。

否則,初始化一個map,用來記錄每一個不重複的長度為10的子串,key為子串,value表示相應的key是否是重複序列。然後遍歷字串,每10位作為一個子串,判斷當前子串如果不存在,則新增到key中;如果存在且已標為重複,則跳過,如果沒有標為重複,則標為重複子串。

最後,返回標為重複的子串即為重複的序列。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class LeetCode_187 {
    /**
     * 雜湊
     *
     * @param s
     * @return
     */
    public static List<String> findRepeatedDnaSequences(String s) {
        // 如果字串的長度小於11,說明不夠組成一個目標子串,不可能有重複的序列,直接返回空
        if (s == null || s.length() < 11) {
            return new ArrayList<>();
        }
        // 記錄每一個不重複的長度為10的子串,key為子串,value表示相應的key是否是重複序列
        Map<String, Boolean> map = new HashMap<>();
        // 長度間隔為10,從第一個字元開始
        int startIndex = 0, endIndex = startIndex + 10;
        // 遍歷到最後一個字元結束
        while (endIndex <= s.length()) {
            String substring = s.substring(startIndex, endIndex);
            // 如果當前子串不存在,則新增到key中;如果存在且已標為重複,則跳過,如果沒有標為重複,則標為重複子串
            if (map.containsKey(substring)) {
                if (!map.get(substring)) {
                    map.put(substring, true);
                }
            } else {
                map.put(substring, false);
            }
            startIndex++;
            endIndex++;
        }
        return map.entrySet().stream().filter(e -> e.getValue()).map(Map.Entry::getKey).collect(Collectors.toList());
    }

    public static void main(String[] args) {
        // 測試用例,期望輸出: ["AAAAACCCCC","CCCCCAAAAA"]
        for (String str : findRepeatedDnaSequences("AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT")) {
            System.out.println(str);
        }
    }
}
【每日寄語】 星星之火,可以燎原。

相關文章