首页 > 其他 > 详细

动态规划-最长公共子序列

时间:2020-03-25 20:27:50      阅读:55      评论:0      收藏:0      [点我收藏+]

1、问题:给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。 

递推公式:

技术分享图片

 

 

 2、原理分析:假设Ax为A串的第x个字符,By为B串的第y个字符。当Ax=By时,问题转换为求(A-Ax,B-By)最长公共子序列+1;当Ax != By时,分别计算(A-Ax,B)的最长公共子序列,(A,B-By)的最长公共子序列,然后两者比较取其大。

 

3、code:

package yrc3;

import java.util.Scanner;

public class Main11_1 {
	public static void main(String args[]) {
		Scanner s = new Scanner(System.in);
		String str1 = "163275";
		String str2 = "5136925";
		int len1 = str1.length();
		int len2 = str2.length();
		int[][] keep = new int[len1+1][len2+1];
		
		/*
		 * 初始化记录数组,假设某一个为空串。
		 */
		for(int i=0;i<=len1;i++) {
			keep[i][0] = 0;
		}
		for(int i=1;i<=len2;i++) {
			keep[0][i] = 0;
		}
		for(int i=1;i<=len1;i++) {
			for(int j=1;j<=len2;j++) {
				if(str1.charAt(i-1)==str2.charAt(j-1)) {
					keep[i][j] = keep[i-1][j-1]+1;
				}else {
					keep[i][j] = Math.max(keep[i-1][j], keep[i][j-1]);
				}
			}
		}
		for(int i=0;i<=len1;i++) {
			for(int j=0;j<=len2;j++) {
				System.out.print(keep[i][j]+" ");
			}
			System.out.println();
		}
		System.out.println(keep[len1][len2]);
	}

}

  

 

 

 

 

 

 

 

 

参考博客:https://blog.csdn.net/lxt_lucia/article/details/81209962

 

动态规划-最长公共子序列

原文:https://www.cnblogs.com/dream-flying/p/12569119.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!