问题:求两个字符串中最大的公共子串;
思路:
1.判断短的那个字符串在不在长的字符串里;
2.如果不在,然后对短的字符串依次进行递减操作,然后再判断在不在长的字符串里;
3.递减的时候注意: 比如要求 "abcdef" 和 "abaacdef"最大公共子川,那么abcdef整个不在后者里面,那么接下来abcdef减掉一个,就是abcde或者bcdef,只有这样才能避免漏 掉。然后依次递减,找到规律:减掉一个时候有两种情况,减掉两个时候,有三种情况……
看一下代码:
class Demo
{
public static String get(String str1,String str2)
{
int len1=str1.length();
int len2=str2.length();
String max="",min="";
max=(len1>=len2) ? str1:str2;
min=(max==str1) ? str2:str1;
System.out.println("max="+max+" min="+min);
for ( int a=0;a<min.length();a++ )
{
for (int x=0,y=min.length()-a;x<=a;x++,y++ )
{
if (max.contains( min.substring(x,y)))
{
return min.substring(x,y); //return作用是返回值并退出方法;
}
}
}
return"zyf"; //上面for里面不是有return 语句了吗?为啥这里多此一举呢,这是因为for语句未必会执行,也即意味着for里 // 的return 语句未必会执行,那么假如没有return “zyf”,那么get()方法就有可能没有返回值,所以编译就 // 会报错。同理在if语句里也是这样的,只有if(){return……}或者只有if(){return……} else if(){return……}
//编译就会报错,改进措施:1.就像本例一样,再加一个return; 2.使用 if else组合,或者if elseif else组 //合,目的都是确保至少有一个return肯定会执行到。
}
public static void main(String[] args)
{
String str1 = "abce1af";
String str2 = "abce1ffaaaaaaf";
System.out.println(get(str1,str2));
}
}