import java.util.*; public class Main{ public static void main(String[] args){ try(Scanner in = new Scanner(System.in)){ String s = in.next(); System.out.println(fun(s)); } } /* 思路是从字符串中分别截取所有长度为1,2,3,4,...的字符串,然后与可能的DNA子串进行匹配 长度1的子串:A,G,T,C 共4个 长度2的子串:AA,AG,AT,AC;GA,GG,GT,GC..共4*4个 长度3的子串:AAA,AAG,AAT,AAC. 共4*4*4个 我们无需一一比较s中是否有具体的哪些子串,我们只需要知道:在比较到如第2个级别,是否有16个两两不同的子串即可 */ public static int fun(String s){ Set<String> set = new HashSet<String>(); int i = 0; int j = 1; //表示查找级别,也就是长度为j的子串 int cnt = 4; while(j < s.length()){ i = 0; //不管你比较到哪个级别,你都需要从最开头来截取片段 while(i + j <= s.length()){ //i+j是你substring的后一个参数,自然要不大于s.length() set.add(s.substring(i,i+j)); if(set.size()>=cnt) break; //已经找到当前级别的所有组合,无需继续分割了 i++; } if(set.size() < cnt) break; //如果当前级别j没有找到对应级别的种数,没必要查找下一级别了 set.clear(); //如果当前级别满足,那就清空set,继续下一级别的判断 j++; cnt *= 4; //进入下一级别,种类又翻了四倍 } return j; } }