当前位置: 首页 > 后端技术 > Java

LeetCode-187-重复的DNA序列

时间:2023-04-01 19:53:35 Java

重复的DNA序列题目描述:所有的DNA都由一系列缩写为'A'、'C'、'G'和'T'的核苷酸组成,例如:“ACGAATTCCG”。在研究DNA时,有时识别DNA中的重复序列非常有帮助。编写一个函数来查找在DNA字符串s中出现不止一次的所有长度为10的目标子串。例子见LeetCode官网。来源:LeetCode链接:https://leetcode-cn.com/probl...版权归LeetCode所有。商业转载请联系官方授权,非商业转载请注明出处。方案一:Hash首先判断特殊情况。如果字符串长度小于11,说明不够构成目标子串,不能有重复序列,直接returnempty。否则,初始化一个map记录每个长度为10的非重复子串,key为子串,value表示对应的key是否为重复序列。然后遍历该字符串,每10位数字作为一个子串进行判断,如果当前子串不存在,则添加到key中;如果它存在并且已经被标记为重复,它将被跳过,如果它没有被标记为重复,它将被标记为重复字符串。最后,将标记为重复的子字符串作为重复序列返回。importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;publicclassLeetCode_187{/***hash**@params*@return*/publicstaticListfindRepeatedDnaSequences(Strings){//如果字符串长度小于11,说明不够构成目标子串,不可能有重复序列,所以返回空if(s==null||s.length()<11){returnnewArrayList<>();}//记录每个长度为10的不重复子串,key为子串,value表示对应的key是否为重复序列Mapmap=newHashMap<>();//长度间隔为10,从第一个字符开始intstartIndex=0,endIndex=startIndex+10;//遍历到最后一个字符并结束while(endIndex<=s.length()){Stringsubstring=s.substring(startIndex,endIndex);//如果当前子串不存在,则添加到key中;如果存在并且已经标记为重复,则跳过,如果没有标记为重复,则标记为重复子串if(map.containsKey(substring)){if(!map.get(substring)){map.put(子串,真的);}}else{map.put(substring,false);}开始索引++;结束索引++;}返回map.entrySet().stream().filter(e->e.getValue()).map(Map.Entry::getKey).collect(Collectors.toList());}publicstaticvoidmain(String[]args){//测试用例,预期输出:["AAAAACCCCC","CCCCCAAAAA"]for(Stringstr:findRepeatedDnaSequences("AAAAACCCCCAAAAACCCCCCAAAAAAGGGTTT")){System.out.println(str);}}}【每日留言】星星之火,可以燎原