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

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


一,查找两个字符串之间的最长字串(这里是字串)
举个例子,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;
	}
}















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值