看到昨天的大佬们说国庆完了以后的每日一题会变难,把我吓得,结果今天这道题也还好呀!做完了的我来打卡来啦,嘿嘿嘿!那么国庆过后开学的第一天的你或者上班的你有Fighting吗?冲呀!
所有 DNA 都由一系列缩写为 ‘A’,‘C’,‘G’ 和 ‘T’ 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。
今天的这道题,我开始看到的时候其实是有一点点懵的,因为我不是很清楚DNA是什么,我第一遍看完题目并不是很通透,但我大概知道它的目的就是要找出连续10个字符连接起来重复出现的数组,于是我的第一反应是和10月三日的小数部分循环一样,但是当时我是通过余数一样时找出来的呀,这个字符串怎们弄呢,我就有头脑一热,用集合,将每10个字符组成的一个字符串保存到集合里面,最后在通过集合内部比较,出现相同的数据就提出来,保存到另一个集合里面,可是这样比较我又觉得太麻烦了,我看了一眼这个题目是一道中等难度的题,那么我如果这样做,我的时间复杂度在80%以上的概率会超过时间限制,于是我想到了用两个HashSet集合保存,因为HashSet集合不会保存相同的元素,所以当第一个集合不保存时,第二个集合就来保存,通过第二个集合的去重后将出现果的数据保存下来,就是我们这道题最终的解法了。
public List<String> findRepeatedDnaSequences(String s) {
List<String> ls = new ArrayList<String>();
int len = s.length();
//必须大于10个,等于10个就只出现了一次,返回为空
if(len <= 10){
return ls;
}
Set<String> set1 = new HashSet<String>();
Set<String> set2 = new HashSet<String>();
for(int i = 0; i<=len-10; i++){
String res = s.substring(i,i+10);
//由于hashset集合不会重复添加,所以set1集合不会添加重复的元素
if(!set1.add(res)){
//当set1添加过后,在利用set2去一次重,不会出现重复的元素
if(set2.add(res)){
//两次筛选过后最后添加元素到我们的集合之中,
ls.add(res);
}
}
}
return ls;
}
LeetCode运行结果截图
Ps:每日一句毒鸡汤:等自己为人父为人母了,才理解他们当初是多么努力…抑制住自己想掐死你的冲动……