- 重复的DNA序列
所有 DNA 都由一系列缩写为 ‘A’,‘C’,‘G’ 和 ‘T’ 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。
提示:
0 <= s.length <= 105
s[i] 为 ‘A’、‘C’、‘G’ 或 ‘T’
示例 1:
输入:s = “AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT”
输出:[“AAAAACCCCC”,“CCCCCAAAAA”]
示例 2
输入:s = “AAAAAAAAAAAAA”
输出:[“AAAAAAAAAA”]
解析过程:
1.ArrayList特点:
有序:按照添加的顺序
不唯一:同一个元素可以装多次
如何创建泛型对象:ArrayList<泛型> list=new ArrayList<>();
2. getOrDefault(key,default):若存在相应的key,则返回其对应的value,否则返回给定的默认值。
需要统计一个字符串中所含的字母及对应字母的个数:key的值相同,使value的值加1。
方法:
1)定义一个哈希表hm
2)hm.put(key,hm.getOrDefault(key,0)+1);
若没有就是0,若有就是原有值增1
3.Map集合
1)添加功能
V put(K key,V value):添加元素。
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
2)获取功能
V get(Object key):根据键获取值
4. substring():substring 方法用于提取字符串中介于两个指定下标之间的字符。
语法
stringObject.substring(i,j);
思路:设置目标子串的长度为定值,判断hm中的内容s1是否有超过1个的,若有,则加入集合str中,最后返回str即可。
class Solution {
public List<String> findRepeatedDnaSequences(String s) {
int length=10;
List<String> str=new ArrayList<>();
Map<String,Integer> hm=new HashMap<String,Integer>();
int l=s.length();
for(int i=0;i<=l-length;++i){
String s1=s.substring(i,i+length);
hm.put(s1,hm.getOrDefault(s1,0)+1);
if(hm.get(s1)==2){
str.add(s1);
}
}
return str;
}
}
结果:
执行用时:23 ms, 在所有 Java 提交中击败了22.89%的用户
内存消耗:47 MB, 在所有 Java 提交中击败了37.34%的用户
通过测试用例:31 / 31