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

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

 

posted @ 2020-03-25 20:15  Yrc的楚门的世界  阅读(169)  评论(0编辑  收藏  举报