重複的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);
}
}
}
【每日寄語】 星星之火,可以燎原。