第一题 寻找最大公共子串
解题思路第一种暴力迭代,第二种动态规划
暴力迭代,暴力迭代注意char变为string可采用strb1.charAt(x)+"";的方式
public static String findmax(String str1, String str2) {
StringBuffer strb1 = new StringBuffer(str1);
StringBuffer strb2 = new StringBuffer(str2);
String temp="";
String maxstr ="";
int x = 0;
int y = 0;
int max = 0;
int count = 0;
if (str1 == null || str2 == null)
return null;
for (int i = 0; i < str1.length(); i++) {
for (int j = 0; j < str2.length(); j++) {
x = i;
y = j;
count = 0;
temp = null;
while (str1.charAt(x) == str2.charAt(y)) {
if (x<str1.length() && y<str2.length()) {
System.out.println("x:"+strb1.charAt(x)+' '+count);
//temp.setCharAt(count, strb1.charAt(x));
if(count==0) temp=strb1.charAt(x)+"";
temp = temp+strb1.charAt(x);
count++;
x++;
y++;
} else {
break;
}
if(max<count) {
max = count;
maxstr=temp;
}
}
}
}
System.out.println("the big substr count is:"+max);
System.out.println("the big substr str is:"+maxstr);
return maxstr;
}
动态规划还是很神奇的想法,参考别人的思路貌似弄出来了,但是感觉参考的那篇代码是错误的,因为测试数据不通过;
原理就是用两个字符串组成一个二维数组,相等地方设置为1,不等为0,连续数组就是对角线1的连续长度,于是就让连续字符相加找最大的,如果子字符串相等相等时显然c[i][j] = c[i-1][j-1]+1;这些话还是要画图解释啊……
public static String dpfindmax(String str1, String str2) {
String maxstr ="";
int max = 0;
int[][] c = new int[str1.length()][str2.length()];
for(int i=1;i<str1.length();i++) {
for(int j=1;j<str2.length();j++) {
System.out.println("is is:"+i+" j is:"+j);
if(str1.charAt(i)==str2.charAt(j)) {
System.out.println("acc:");
c[i][j] = c[i-1][j-1]+1;
} else {
c[i][j] =0;
}
if(max<c[i][j]) {
max = c[i][j];
}
}
}
System.out.println("the big substr count is:"+max);
return maxstr;
}