概述:
第一次写博客,记录一下算法的解析过程,以后也会不定期更新一些算法
解决方案主要为java
以下算法题目来源于
力扣
本题连接:
力扣
https://leetcode-cn.com/problems/repeated-dna-sequences/
问题描述
题目:
DNA序列 由一系列核苷酸组成,缩写为 ‘A’, ‘C’, ‘G’ 和 ‘T’.。
例如,”ACGAATTCCG” 是一个 DNA序列 。
在研究 DNA 时,识别 DNA 中的重复序列非常有用。
给定一个表示 DNA序列 的字符串 s ,返回所有在 DNA 分子中出现不止一次的 长度为 10 的序列(子字符串)。你可以按 任意顺序 返回答案。
示例 1:
输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" 输出:["AAAAACCCCC","CCCCCAAAAA"]
示例 2:
输入:s = "AAAAAAAAAAAAA" 输出:["AAAAAAAAAA"]
题目分析:
想法:使用滑动窗口 窗口大小设置为 10 ,从左至右依次处理字符串s,每次得到窗口的为s[i]-10为开头,s[i]-1为结尾的字符串(substring()方法含头不含尾,所以代码中不需要-1),依次放入到map中使用getOrDefault()方法,获取每次当前窗口的字符串为key的值,不存在则用默认值,存在则保存到新的list中并返回
解决方案:
public static List<String> findRepeatedDnaSequences(String s) { int len = s.length(); if (len < 10) return new ArrayList<>(); Map<String, Integer> map = new HashMap<>(); List list = new ArrayList(); for (int i = 10; i <= len; i++) { String sub = s.substring(i - 10, i); Integer orDefault = map.getOrDefault(sub, 0);//当前map如果有此key则用对应的value值,没有则用默认值 if (orDefault >= 1) {//如果大于1证明不是第一次出现 list.add(sub); } map.put(sub,orDefault+1); } return list; }