package cn.ic; //要求:找出两个字符串中的最大子串,即最大的交集。如:"udappyzk"和"xzhappymol"最大子串为appy //步骤: //1 找出两个字符串中的较短者 //2 分别将较短子串除去0,1,2,3,4……个元素,且判断除去X个元素后的子串是否在较长字符串中出现 //分析: //以题目中较短字符串"udappyzk"为例 //(1)去除0个元素的情况,有1种操作,得到本身字符串作为最大子串 //(2)去除1个元素的情况,有2种操作,即分别去除第一个和最后一个得到dappyzk和udappyz //(3)去除2个元素的情况,有3种操作,即去掉头两个和去掉尾两个和头尾各去一个即得到appyzk和udappy和dappyz //(4)去除3个元素的情况,有4种操作,即去掉头三个和去掉尾三个和头去一个尾去两个和头去两个尾一个 // 即ppyzk和udapp和dappy和appyz //综上分析: //1 去除N个元素,共有N+1种可能 //2 头去元素个数+尾去元素个数=N //举例子:当要去掉3个元素时,我们分别看左右去掉的个数 //左 +右=N //3 +0 =3 //0 +3 =3 //1 +2 =3 //2 +1 =3 //调整变形可得: //0 +3 =3 //1 +2 =3 //2 +1 =3 //3 +0 =3 //这样便推知核心算法: //第一个for语句(外层for语句)表示要去掉几个元素 //第二个for语句(内层for语句)表示如何去除元素 public class MaxSubString { public static void main(String[] args) { String s="udappyzk"; String l="xzhappymol"; FindMaxSubString findMaxSubString=new FindMaxSubString(); System.out.println("最大子串="+findMaxSubString.search(s, l)); } } class FindMaxSubString{ public String search(String string1,String string2){ String longer; String shorter; String result=null; String tempString=null; if(string1.length()>=string2.length()){ longer=string1; shorter=string2; }else{ longer=string2; shorter=string1; } for(int sh=0;sh<shorter.length();sh++){//核心算法 for(int x=0;x<=sh;x++){ tempString=shorter.substring(x, shorter.length()-sh+x);//核心语句shorter.length()-(sh-x) if(longer.indexOf(tempString)!=-1){ result=tempString; return result; } } } return result; } }