package trial;public class Trial {public static void main(String[] args){ System.out.println(longestSubsequence("cotton buds","albino spider"));
}public static int longestSubsequence(String s1,String s2){//特殊情况1:s1 s2对象不存在,null代表堆内存中根本没有这个东西if (s1 == null || s2 == null){return 0;}//特殊情况2:s1 s2是长度为0的字符串if(s1.equals("") || s2.equals("")){return 0;}//定义较长字符串和较短字符串String max = (s1.length() > s2.length()) ? s1:s2;String min = (s1.length() < s2.length()) ? s1:s2;//下面专注于较短的字符串,假设其长度为n,依次找到它的长度为n, n-1, n-2....1的子串,//若另外那个较长的字符串包含了较短字符串的某个子串,则找到了二者的最长公共子串。//遍历较短字符串for(int i = 0; i<min.length();i++){/*依此减少较短字符串的字符数量当i=0时,begin = 0,end = 短字符长度,即n,begin++和end++代表着,第二步从1到n+1,但是由于end<=min.length()这个条件,所以第二步实际上是1到n索引的子串当i=1时,begin = 0,end = n-1,current字符串就是,先是0到n-1的子串,然后是1到n索引的子串,如此往下当i=2时,begin = 0,end = n-2,current字符串就是,先是0到n-2的子串,然后是1到n-1的子串,如此往下*/for(int begin = 0, end = min.length()-i; end <= min.length(); begin++, end++){String current = min.substring(begin,end);//判断较长字符串是否包含较短字符串的子串的元素,如果包含则返回trueif(max.contains(current)){ return current.length(); } }}return 0; }
}