您的位置:首页 > 其它

查找两个字符串的最大字串和子串

2017-05-26 20:34 369 查看
关于查找两个字符串之间的最长子串和最长公共子序列。用的都是动态规划的方法,就是小地方有区别。

一,查找两个字符串之间的最长字串(这里是字串)

举个例子,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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: