DNA序列
题目难度:中等
知识点:数学逻辑、宽度优先遍历
方法一
采用宽度优先遍历,得到长度为i的子串的所有排列,比较字符串中是否存在全部子串,若全部存在,则继续下一个长度的子串的遍历,否则,i即为字符串中没有包含所有该长度的子串,输出i,循环结束。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()) { String str = sc.next(); //i表示子串的长度 for(int i = 1; i < str.length()+1; i++) { String strArr[] = getAllPermutation(i); boolean flag = true; for(int index = 0; index < strArr.length; index++) { //判断字符串中是否存在该子串 if(str.indexOf(strArr[index]) == -1) { flag = false; break; } } if(!flag) { System.out.println(i); break; } } } } //宽度优先遍历 public static String[] getAllPermutation(int n) { int arr[] = new int[n + 1]; String strArr[] = new String[(int)Math.pow(4, n)]; int index = 0; while(arr[0] == 0) { String curStr = ""; for(int i = 1; i < n + 1; i++) { if(arr[i] == 0) curStr += "A"; else if(arr[i] == 1) curStr += "C"; else if(arr[i] == 2) curStr += "G"; else if(arr[i] == 3) curStr += "T"; } strArr[index] = curStr; index++; arr[n] = arr[n] + 1; for(int i = n; i >= 0; i--) { if(arr[i] == 4) { arr[i] = 0; arr[i - 1] += 1; } } } return strArr; } }
方法二
按照子串的数量来判断是否全部包含。子串中,每一种长度i都会有4的i次方个不同的子串。定义一个set容器,将长度为i的子串依次加入到set容器中去,set容器会自动除去重复的元素,因此set的大小就是所有子串的数量,当set小于4的i次方时,即字符串中没有包含所有该长度的子串。
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); String s = in.nextLine(); //i表示子串的长度 for(int i=1;i<=s.length();i++){ HashSet<String> set= new HashSet<String>(); //遍历字符串,将所有长度为i的子串加入set中 for(int j=0;j<=s.length()-i;j++){ set.add(s.substring(j,j+i)); } //如果长度为i子串的个数是否小于4^i if(set.size() < Math.pow(4,i)){ System.out.println(i); break; } } } }