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

来源:互联网 发布:网络投资理财万盈金融 编辑:程序博客网 时间:2024/06/07 18:37
关于查找两个字符串之间的最长子串和最长公共子序列。用的都是动态规划的方法,就是小地方有区别。


一,查找两个字符串之间的最长字串(这里是字串)
举个例子,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[][] c=new int[a][b];

     //第一行的比较,行对应着b
for(int i=0;i<b;i++){
if(aa[i]==bb[0]){
//找到相等的数之后,这行后面的数据都设置为1
c[0][i]=1;
for(int k=i+1;k<b;k++){
c[0][k]=1;
}
break;
}
else
c[0][i]=0;
}

          //第一列,列对应着a
      for(int i=0;i<a;i++){
if(bb[i]==aa[0]){
c[i][0]=1;
for(int k=i+1;k<a;k++){
c[k][0]=1;
}
break;
}
else
c[i][0]=0;
}

//余下的数据进行处理
for(int i=1;i<a;i++){
for(int j=1;j<b;j++){
//如果该点的横坐标和纵坐标相等,则比较的三个地方点的大小,否则比较两个点


的大小
if(aa[i]==bb[j]){
c[i][j]=Max(c[i-1][j],c[i][j-1],c[i-1][j-1]+1);
}
else
c[i][j]=Math.max(c[i-1][j], c[i][j-1]);
}
}

//这个数组的最后一个数据,代表了这个最大公共字串的个数
System.out.println(c[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.


代码实现:(java)


package src1;


public class Demo7 {


   public static void main(String[] args) {
String str1="1234567";
String str2="1245";

char[] aa=str1.toCharArray();
char[] bb=str2.toCharArray();

int a=str1.length();
int b=str2.length();

//建立一个二维数组存储数据
int[][] c=new int[a][b];
//定义一个最大数
int max=0;

//第一行的比较,行对应着b
for(int i=0;i<b;i++){
if(aa[i]==bb[0]){
//找到相等的数之后,这行后面的数据都设置为1
c[0][i]=1;
for(int k=i+1;k<b;k++){
c[0][k]=1;
}
break;
}
else
c[0][i]=0;
}

    //第一列,列对应着a
for(int i=0;i<a;i++){
if(bb[i]==aa[0]){
c[i][0]=1;
for(int k=i+1;k<a;k++){
c[k][0]=1;
}
break;
}
else
c[i][0]=0;
}

//余下的数据进行处理
for(int i=1;i<a;i++){
for(int j=1;j<b;j++){
//如果该点的横坐标和纵坐标相等,则比较的三个地方点的大小,否则比


较两个点的大小
if(aa[i]==bb[j]){
c[i][j]=Max(c[i-1][j],c[i][j-1],c[i-1][j-1]+1);

if(c[i][j]>max){
max=c[i][j];
}

}
else
c[i][j]=0;//就是这个地方和字串不同
}
}


System.out.println(max);

}
   
   public static int Max(int a,int b,int c){
    int temp=a;
    if(a<b){
    temp=b;
    }
    return temp>c?temp:c;
   }
}















阅读全文
0 0
原创粉丝点击