算法题解:求两个字符串的最长公共子序列问题(JAVA代码详解)_求两个字符串的最长公共子序列java-程序员宅基地

技术标签: JAVA  算法  DP算法  JAVA算法学习  最长公共子序列  算法设计  算法分析与设计  

求两个字符串的最长公共子序列问题(JAVA代码详解)

最长公共子序列问题: 给定两个字符串A、B,求A与B的最长公共子序列(子序列不要求是连续的)
举例:
字符串A: abcicba
字符串B:abdkscab
其中:ab、abc、abca都是公共子序列,但是abca是最长公共子序列

从文件读取输入:
1A2C3D4B56
B1D23CA45B6A

输出:
123456
或者 12C4B6都正确

package com.bean.algorithmexec;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class LCS {

	/*
	 * 最长公共子序列问题 给定两个字符串A、B,求A与B的最长公共子序列(子序列不要求是连续的) 
	 * 举例: 
	 * 字符串A: abcicba 
	 * 字符串B:abdkscab
	 * 其中:ab、abc、abca都是公共子序列,但是abca是最长公共子序列
	 * 
	 * 从文件读取输入:
	 * 1A2C3D4B56
	 * B1D23CA45B6A
	 * 
	 * 输出:
	 * 123456 
	 * 
	 * 或者 12C4B6都正确
	 * 
	 * (这里的算法其实存在一个缺陷)
	 */

	public static void main(String[] args) throws FileNotFoundException {
		// TODO Auto-generated method stub

		System.setIn(new FileInputStream("G:\\lcs.txt"));
		Scanner sc = new Scanner(System.in);
       
		String aStr = sc.nextLine(); //读取A字符串
		String bStr = sc.nextLine(); //读取B字符串
		int aLen = aStr.length();
		int bLen = bStr.length();
		//构造DP矩阵
		int[][] dp = new int[aLen + 1][bLen + 1];
		for (int i = 1; i < aLen + 1; i++)
			for (int j = 1; j < bLen + 1; j++)
				if (dp[i - 1][j] == dp[i][j - 1] && aStr.charAt(i - 1) == bStr.charAt(j - 1)
						&& dp[i - 1][j] == dp[i - 1][j - 1])
					dp[i][j] = dp[i - 1][j] + 1;
				else
					dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
		int max = dp[aLen][bLen];
		StringBuilder sb = new StringBuilder();
		while (max > 0) {
			if (dp[aLen - 1][bLen] == dp[aLen][bLen - 1] && dp[aLen - 1][bLen] + 1 == dp[aLen][bLen]) {
				sb.append(aStr.charAt(aLen - 1));
				max--;
				aLen--;
				bLen--;
			} else {
				if (dp[aLen][bLen - 1] == dp[aLen][bLen])
					bLen--;
				else
					aLen--;
			}
		}

		System.out.println(sb.reverse().toString());
	}

}

另一种算法设计

这个问题是一个经典的动态规划问题,先来介绍求解动态规划表的过程。

第1步:

如果str1的长度为M,str2的长度为N,则生成大小为M*N的矩阵dp,行数为M行,列数为N列。
d p [ i ] [ j ] dp[i][j] dp[i][j]的含义是 s t r 1 [ 0... i ] str1[0...i] str1[0...i] s t r 2 [ 0... j ] str2[0...j] str2[0...j]的最长公共子序列的长度。从左向右,从上向下计算矩阵dp。

其中:记str1中从第0个字符到第i个字符为 s t r 1 [ 0... i ] str1[0...i] str1[0...i];记str2中从第0个字符到第j个字符为 s t r 2 [ 0... j ] str2[0...j] str2[0...j]

矩阵dp第一列即 d p [ 0... M − 1 ] [ 0 ] dp[0...M-1][0] dp[0...M1][0] d p [ i ] [ 0 ] dp[i][0] dp[i][0]的含义是 s t r 1 [ 0... i ] str1[0...i] str1[0...i] s t r 2 [ 0 ] str2[0] str2[0]的最长公共子序列长度。
s t r 2 [ 0 ] str2[0] str2[0]只有一个字符,所以 d p [ i ] [ 0 ] dp[i][0] dp[i][0]最大为1。如果 s t r 1 [ i ] = = s t r 2 [ 0 ] str1[i]==str2[0] str1[i]==str2[0],令 d p [ i ] [ 0 ] = 1 dp[i][0]=1 dp[i][0]=1,一旦 d p [ i ] [ 0 ] dp[i][0] dp[i][0]被置为1,之后的 d p [ i + 1... M − 1 ] [ 0 ] dp[i+1...M-1][0] dp[i+1...M1][0]也都为1。

例如: s t r 1 [ 0... M

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/seagal890/article/details/79178848

智能推荐

linux:TeamViewer安装使用详解-程序员宅基地

文章浏览阅读77次。How do I install TeamViewer on my Linux distribution?Graphical installationFor installing TeamViewer, we recommend using the graphical installer. The graphical installer can be invoked b..._teamviewer:amd64 依赖于 libc6 (>= 2.17).

CentOS8解决“Failed to download metadata for repo ‘appstream‘”错误_centos linux 8 - appstream 63 b/s | 38 b 00:00 err-程序员宅基地

文章浏览阅读3.5w次,点赞64次,收藏87次。在CentOS8上执行下面命令时报错yum install epel-releaseCentOS Linux 8 - AppStream 23 B/s | 38 B 00:01 Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist原因在2022年1..._centos linux 8 - appstream 63 b/s | 38 b 00:00 error: failed to download met

x86指令格式-程序员宅基地

文章浏览阅读774次。学习于逆向工程核心原理IA-32指令章节格式x86指令格式指令前缀出现特定操作码时用作补充说明,图中的冒号前的64就是指令前缀操作码实际的指令,如图中的FF、89、80都是操作码ModR/M辅助说明操作码的操作数(操作数的个数、种类[寄存器、内存地址、常量]),图中的SIB..._ebxmodr

北京的大学计算机专业厉害的,计算机专业最强的大学有哪些?哪个大学计算机专业全国第一?附名单...-程序员宅基地

文章浏览阅读735次。选择科目测一测我能上哪些大学选择科目领取你的专属报告>选择省份关闭请选择科目确定v>计算机类专业一直位于热门专业行列,主要是因为计算机行业的工资待遇是很多行业都不能相比的,所以吸引了众多学子踊跃报考该专业。那么计算机专业最强的大学有哪些?哪个大学的计算机专业全国第一?本期小编将为大家解答相关问题。一、计算机专业最强的大学有哪些?根据教育部全国第四轮学科评估结果进行参考,计算机专业最强的..._北京计算机最好学校

vue3 excel 导出功能_vue3导出excel表格-程序员宅基地

文章浏览阅读1.3k次,点赞2次,收藏3次。vue3 excel导出_vue3导出excel表格

课后作业:创建一个程序将摄氏温度值(C)转换为华氏温度值(F)_用c#编写程序实现输入摄氏温度c的值输出对应华氏温度f的值-程序员宅基地

文章浏览阅读1.2w次,点赞4次,收藏11次。// Copyright (c) 2014软件技术2班_用c#编写程序实现输入摄氏温度c的值输出对应华氏温度f的值

随便推点

GC日志分析_已追加形式gc日志-程序员宅基地

文章浏览阅读2.1w次,点赞17次,收藏57次。通过 -XX:+PrintGCDetails 启用日志GC (minor )日志Full GC 日志_已追加形式gc日志

vue2-happyfri 开源项目分析-程序员宅基地

文章浏览阅读1.9k次,点赞3次,收藏7次。Vue.js是一套构建用户界面的渐进式框架。自诞生之日起就受到了广泛的关注,和广大的前端开发者一样,笔者着迷于其简洁友好的语法、强大的单文件组件以及丰富的生态系统。通过这样一个简单但全面的开源项目分析,笔者希望可以入门这个框架且做一定的深入了解。_vue2-happyfri

黑马程序员_01 基础小结-程序员宅基地

文章浏览阅读488次。最常用的编程元素一: 常量与变量 1, 常量:就是固定不变的量,一旦被定义,他的值就不会被改变 。 往往用final修饰。 2,变量:变量是利用声明的方式,将内存中的某个块保留下来。 (1)说明 1:要求在使用一个变量之前要对变量的类型加以声明。 2:java中一个变量的声明就是一条完整的语句

maya_[maya学习笔记(1)] 视窗的基本操作-程序员宅基地

文章浏览阅读589次。三点照明法_[maya学习笔记(1)] 视窗的基本操作

C++ vector变量等导致内存泄露问题的解决方法_c++ vector是否会造成内存泄漏-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏7次。之前在做一个音频特征提取的批量处理程序,老是出现内存泄露问题,用Visual Leak Detector(VLD)工具做了下检测,检测出了一些问题,解决后还是会有问题。之后继续排查,因为我的代码中,大量的音频相关处理的数据都存成了vector变量,推测是不是vector变量的析构问题,上网查了些资料,现写出解决过程:1、关于Visual Leak Detector的配置与使用主要也_c++ vector是否会造成内存泄漏

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java宠物商店信息展示与服务订购系统7q5ic-程序员宅基地

文章浏览阅读77次。现在流行的 是Spring Boot 做的 SSM框架:SpringMVC + Spring + MyBatisVUE + Spring Boot主要还是结合自己的实际水平来。如果你真的在选题这一方面完全没思路的话,下面有一些题目可以供你参考下,是之前上半年完成的部分的毕设程序,具体获取见文末。面对老师五花八门的设计要求,首先自己要明确好自己的题目方向,并且与老师多多沟通,用什么编程语言,使用到什么数据库,确定好了,在开始着手毕业设计。ssm基于ssm的校园失物招领平台h5xpq。

推荐文章

热门文章

相关标签