啥也不说了 都在代码里了 ^-^
package 面试小算法.相同子串;
import java.util.ArrayList;
import java.util.List;
import 面试小算法.Test04;
public class Test {
/*
* 总体思路为:先找出小字符串 外层循环遍历小字符串 内层循环遍历小字符串索引+1的字符串
* 从小字符串中截取(外层索引,内层索引)
* 判断 分两种 当可以为本身字符串时 只要大字符串中包含次字符串就为true
* 当不能为本身字符串时 且真并为本身时 判断大字符中是否包含此字符串 如包含则为true
* 上述两个有一个成立就判断当前字符串长度是否大于当前存最大字符串长度的变量
* 如大于则清空集合中元素并把最大字符串长度变为当前字符串长度,再往集合中添加这个元素
* 如果等于当前集合的最大元素则直接添加进去就OK了。
*/
public List<String> searchMaxString(String s1,String s2,boolean isSelf){
//获取大字符串 和 小字符串
String shortS = s1.length()>s2.length()?s2:s1;
String longS = s1.length()>s2.length()?s1:s2;
//判断当前子串长度是否是最长的
int length = 0;
//存储结果 之所以用集合是因为可能有多个长度相同的子串
List<String> result = new ArrayList<String>();
for(int i=0;i<shortS.length();i++){
for(int j=i+1;j<=shortS.length();j++){
//截取当前位置起的长度
String temp = shortS.substring(i,j);
//可以等于自身时
boolean flag1 = isSelf && longS.contains(temp);
//不可以等于自身时
boolean flag2 = !isSelf && temp!=shortS && longS.contains(temp);
//假如满足其中一条
if(flag1 || flag2){
//假如长度当于当前最小子串清空集合并添加元素
if(temp.length()>length){
length = temp.length();
result.clear();
result.add(temp);
//假如等于添加进集合
}else if(temp.length()==length){
result.add(temp);
}
}
}
}
return result;
}
public static void main(String[] args){
String a = "abceLoveXyzasfdalllllfdsafdsfds";
String b = "erebgdLovegureererfdsfdsalllllfdsafdsa";
List<String> result = Test04.getMaxSameSubStr(a, b, true);
for(String s:result){
System.out.println(s);
}
}
}