题目描述:
牛牛从生物科研工作者那里获得一个任务,这次牛牛需要帮助科研工作者从DNA序列s中找出最短没有出现在DNA序列s中的DNA片段的长度。
例如:s=AGGTCTA 序列s中包含了所有长度为1的('A','G','C','T')片段,但是长度为2的没有全部包含,例如序列中不包含"AA",岁哦一输出2.
输入描述:
输入包含一个字符串s,字符串长度length(1<=length<=2000),其中只包含'A','G','C',T'这四种字符。
输出描述:
输出一个正整数,即最短没有出现在DNA序列s中的DNA片段的长度。
错误思路:刚开始我没有完全理解题意,以为只要字符串中不包括连续的如"AA","GG","CCC","TTT"即输出。但其实在长度为2时,要考虑所有长度为2的情形:"AA","CC","GG","TT","AC","AG","AT","CG","CA","CT","GA","GC","GT","TA","TC","TG"等4*4=16个可能。只要有一个不满足,就输出2.
正确解法:对每个长度为i的字符串,我们可以用集合记录s中从下标0开始,长度为i出现的字符串,只要它的总个数小于4的i次方,就说明最短没有出现在DNA片段的长度为i。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s=sc.nextLine();
int n=s.length();
for(int i=1;i<=n;i++){
HashSet<String> set=new HashSet<>();//对每个长度为i的字符串,定义一个集合用来存放s中所有出现的字符串。
for(int j=0;j<n-i;j++){
set.add(s.substring(j,j+i));
}
if(set.size()<Math.pow(4.0,i)){
System.out.println(i);
break;
}
}
}
}