这个题是检测子串的重复次数。开始想当然的想到通过s.substring依次取出10个字符串,然后通过equal去比较是否相同。虽然结果可以,但是毫无疑问,时间复杂度O(n2)超时。
第一层遍历是无法避免的,可以优化的是对字串的对比。类似于字串问题,可以转换为字节操作。因此修改代码如下:
public class Solution { public List<String> findRepeatedDnaSequences(String s) { List<String> resultlist = new ArrayList<>(); //最终的结果 int key = 0; if (s.length()==0) { return resultlist; } HashMap<Character,Integer> map = new HashMap<Character, Integer>(); //对四种字母进行编码,可以减少存储空间,同时加快比较速度 map.put('A',0); map.put('C',1); map.put('G',2); map.put('T',3); HashMap<Integer,Integer> result = new HashMap<Integer, Integer>(); for(int i=0;i<s.length();i++) { key = (key<<2 | map.get(s.charAt(i)) & 0x3) & 0xfffff; //00.01.10.11可以分别表示四种字符,占2位。每次一个左移2位,通过&0x3可以取出后两位。fffff固定取2*10位 if(i<9) continue; if (result.get(key) == null) { result.put(key, 1); } else if (result.get(key) == 1) { resultlist.add(s.substring(i - 9, i + 1)); result.put(key, 2); } } return resultlist; } }