具体实现上,为了保证不盲目把初始 n 加到结果中,第一层 dfs 里传进去的 prev 是 n - 1.
这题的 dfs 里 base case 还不太一样,我们做的是试图直接把 n 加进去作为一个解,同时要注意不能直接 return ,否则后面的解就都看不到了。
真正的 return ,是在对于 n 来讲从大到小连 i = 2 都尝试过作为 factor 之后自然结束搜索。
publicclassSolution {publicList<List<Integer>> getFactors(int n) {List<List<Integer>> rst =newArrayList<List<Integer>>();dfs(rst,newArrayList<Integer>(), n, n -1);return rst; }privatevoiddfs(List<List<Integer>> rst,List<Integer> list,int n,int prev){if(n <= prev){list.add(n);rst.add(newArrayList<Integer>(list));list.remove(list.size() -1);//return ; }for(int i = n /2; i >=2; i--){if(n % i ==0&& i <= prev){list.add(i);dfs(rst, list, n / i, i);list.remove(list.size() -1); } } }}
publicclassSolution {publicList<String> findRepeatedDnaSequences(String s) {List<String> list =newArrayList<>();int N =s.length();int[] hash =newint[1048576];for(int i =0; i <= N -10; i++){String str =s.substring(i, i +10);int index =encode(str); hash[index] ++;if(hash[index] ==2) list.add(str); }return list; }privateintencode(String s){int num =0;for(int i =0; i <s.length(); i++){char c =s.charAt(i); num = num <<2;if(c =='A') num +=0; if(c =='C') num +=1;if(c =='G') num +=2;if(c =='T') num +=3; }return num; }privateStringdecode(int num){StringBuilder sb =newStringBuilder();for(int i =0; i <10; i++){if(num %4==0) sb.append('A');if(num %4==1) sb.append('C');if(num %4==2) sb.append('G');if(num %4==3) sb.append('T'); num = num >>2; }returnsb.reverse().toString(); }}