关于查找两个字符串之间的最长子串和最长公共子序列。用的都是动态规划的方法,就是小地方有区别。
一,查找两个字符串之间的最长字串(这里是字串)
举个例子,str1="1234567";str2="1245";
最长公共字串就是1245,长度是4.
代码是(java实现):
二,查找两个字符串之间的最长子串(这里是子串)
举个例子,str1="1234567";str2="1245";
最长公共字串就是12或者45,长度是2.
一,查找两个字符串之间的最长字串(这里是字串)
举个例子,str1="1234567";str2="1245";
最长公共字串就是1245,长度是4.
代码是(java实现):
public class Demo1 {
public static void main(String[] args) {
String str1="1234567";
String str2="12345";
char[] aa = str1.toCharArray();
char[] bb = str2.toCharArray();
int a = str1.length();
int b = str2.length();
//建立一个二维数组存储数据
int[][] dp = new int[a][b];
dp[0][0] = aa[0]==bb[0]?1:0;
//第一行的比较,行对应着b
for(int i=1;i<b;i++){
dp[0][i] = Math.max(dp[0][j-1],aa[0] =bb[i]?1:0);
}
//第一列,列对应着a
for(int i=1;i<a;i++){
dp[i][0] = Math.max(dp[i-1][0],aa[i]==bb[0]?1:0);
}
//余下的数据进行处理
for(int i=1;i<a;i++){
for(int j=1;j<b;j++){
//如果该点的横坐标和纵坐标相等,则比较的三个地方点的大小,否则比较两个点的大小
if(aa[i]==bb[j]){
dp[i][j]=Max(c[i-1][j],c[i][j-1],c[i-1][j-1]+1);
}
else
dp[i][j]=Math.max(c[i-1][j], c[i][j-1]);
}
}
//这个数组的最后一个数据,代表了这个最大公共字串的个数
System.out.println(dp[a-1][b-1]);
}
public static int Max(int a,int b,int c){
int temp=a;
if(a<b){
temp=b;
}
return temp>c?temp:c;
}
}
二,查找两个字符串之间的最长子串(这里是子串)
举个例子,str1="1234567";str2="1245";
最长公共字串就是12或者45,长度是2.
public class Demo115 {
public static void main(String[] args){
String str1 = "1234567";
String str2 = "23467";
char[] arr1 = str1.toCharArray();
char[] arr2 = str2.toCharArray();
int[][] dp = new int[arr1.length][arr2.length];
int max = 0;
//第一行
for(int i=0;i<arr2.length;i++){
if(arr2[i]==arr1[0]){
dp[0][i] = 1;
for(int j=i+1;j<arr2.length;j++){
dp[0][j] = 1;
}
break;
}
}
//第一列
for(int i=0;i<arr1.length;i++){
if(arr1[i]==arr2[0]){
dp[i][0] = 1;
for(int j=i+1;j<arr1.length;j++){
dp[j][0] = 1;
}
break;
}
}
//余下的数据
for(int i=1;i<arr1.length;i++){
for(int j=1;j<arr2.length;j++){
if(arr2[j]==arr1[i]){
dp[i][j] = findMax(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]+1);
if(dp[i][j]>max){
max = dp[i][j];
}
}
else{
dp[i][j] = 0;
}
}
}
System.out.println(max);
}
public static int findMax(int a,int b,int c){
int temp = a>b?a:b;
return c>temp?c:temp;
}
}