【数据结构与算法】LCS(不连续)

这个问题很经典,典型的动态规划,动态规划就是填一个表,然后遍历一下就行了。

  • 代码实现

/**
 * 源码名称:LCSequence.java
 * 日期:2014-09-02
 * 程序功能:LCS(不连续)
 * 版权:[email protected]
 * 作者:A2BGeek
 */
public class LCSequence {
	private String mOne, mTwo;
	int[][] mMatrix;
	int[][] mB;
	String mResult;

	public LCSequence(String one, String two) {
		mOne = one;
		mTwo = two;
		int lengthOne = one.length();
		int lengthTwo = two.length();
		mMatrix = new int[lengthOne + 1][lengthTwo + 1];
		mB = new int[lengthOne + 1][lengthTwo + 1];
		mResult = "";
	}

	public void generateMatrix() {
		int lengthOne = mOne.length();
		int lengthTwo = mTwo.length();
		for (int i = 1; i <= lengthOne; i++) {
			mMatrix[i][0] = 0;
		}
		for (int j = 1; j <= lengthTwo; j++) {
			mMatrix[0][j] = 0;
		}
		mMatrix[0][0] = 0;
		// 1 stands for upleft, 2 stands for up, 3 stands for left
		for (int i = 1; i <= lengthOne; i++) {
			for (int j = 1; j <= lengthTwo; j++) {
				if (mOne.charAt(i - 1) == mTwo.charAt(j - 1)) {
					mMatrix[i][j] = mMatrix[i - 1][j - 1] + 1;
					mB[i][j] = 1;
				} else if (mMatrix[i - 1][j] >= mMatrix[i][j - 1]) {
					mMatrix[i][j] = mMatrix[i - 1][j];
					mB[i][j] = 2;
				} else if (mMatrix[i - 1][j] < mMatrix[i][j - 1]) {
					mMatrix[i][j] = mMatrix[i][j - 1];
					mB[i][j] = 3;
				}
			}
		}
	}

	public void getLCSequence(String str, int i, int j) {
		if (i == 0 || j == 0) {
			return;
		}
		if (mB[i][j] == 1) {
			getLCSequence(str, i - 1, j - 1);
			mResult += str.charAt(i - 1);
		} else if (mB[i][j] == 2) {
			getLCSequence(str, i - 1, j);
		} else {
			getLCSequence(str, i, j - 1);
		}
	}

	public void printMatrix(int[][] in) {
		for (int i = 0; i < in.length; i++) {
			for (int j = 0; j < in[i].length; j++) {
				System.out.print(in[i][j] + "   ");
			}
			System.out.println();
		}
	}

	public void printMatrix(char[][] in) {
		for (int i = 0; i < in.length; i++) {
			for (int j = 0; j < in[i].length; j++) {
				System.out.print(in[i][j] + "   ");
			}
			System.out.println();
		}
	}

	public static void main(String[] args) {
		String one = "abcbdab";
		String two = "bdcaba";
		LCSequence mLcSequence = new LCSequence(one, two);
		mLcSequence.generateMatrix();
		mLcSequence.printMatrix(mLcSequence.mMatrix);
		System.out.println("------------------------");
		mLcSequence.printMatrix(mLcSequence.mB);
		mLcSequence.getLCSequence(one, one.length(), two.length());
		System.out.println(mLcSequence.mResult);
	}
}
时间: 2024-12-26 16:51:24

【数据结构与算法】LCS(不连续)的相关文章

数据结构与算法之线性表

前言 上一篇<数据结构和算法之时间复杂度和空间复杂度>中介绍了时间复杂度的概念和常见的时间复杂度,并分别举例子进行了一一说明.这一篇主要介绍线性表. 线性表属于数据结构中逻辑结构中的线性结构.回忆一下,数据结构分为物理结构和逻辑结构,逻辑结构分为线性结构.几何结构.树形结构和图形结构四大结构.其中,线性表就属于线性结构.剩余的三大逻辑结构今后会一一介绍. 线性表 基本概念 线性表(List):由零个或多个数据元素组成的有限序列. 注意: 1.线性表是一个序列. 2.0个元素构成的线性表是空表.

常见数据结构与算法整理总结(上)

数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作.算法是为求解一个问题需要遵循的.被清楚指定的简单指令的集合.下面是自己整理的常用数据结构与算法相关内容,如有错误,欢迎指出. 为了便于描述,文中涉及到的代码部分都是用Java语言编写的,其实Java本身对常见的几种数据结构,线性表.栈.队列等都提供了较好的实现,就是我们经常用到的Java集合框架,有需要的可以阅读这篇文章.Java - 集合框架完全解析 一.线性表 1.数组实现 2.链表 二.栈与队列 三.树

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算

这谈的数据结构和算法2好基友[数据结构和算法]

在本文中,小乌龟的数据结构和算法的教学视频学习笔记 第一章:谈谈数据结构和算法这2个好基友 一.聊聊数据结构 1.为什么学数据结构?编程能力有质的飞越,不再停留在调用现成的API,做一个上档次的程序猿. 2.什么是数据结构?数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科. 思考:好吧,简单来说程序设计 =数据结构 + 算法,数据结构就是关系,就是数据元素之间存在的一种或多种特定关系的集合. 3.数据结构分为逻辑结构和物理结构,前者指数据对象中数据

数据结构与算法基础学习笔记

*********************************************            ---算法与数据机结构--- 数据结构:由于计算机技术的发展,需要处理的对象不再是纯粹的数值,还有像字符,表,图像等具有一定结构的数据,需要用好的算法来处理这些数据. 我们把现实中大量而又复杂的问题以特定的数据类型的特定的存储结构保存到主存储器中,以及在此基础上为实现某个功能而执行的相应操作(查找排序),这个相应的操作也叫算法. 数据结构 = 个体 +个体的关系算法 =对存储数据的操

【转】数据结构与算法(上)

数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作.算法是为求解一个问题需要遵循的.被清楚指定的简单指令的集合.下面是自己整理的常用数据结构与算法相关内容,如有错误,欢迎指出. 为了便于描述,文中涉及到的代码部分都是用Java语言编写的,其实Java本身对常见的几种数据结构,线性表.栈.队列等都提供了较好的实现,就是我们经常用到的Java集合框架,有需要的可以阅读这篇文章.Java - 集合框架完全解析 一.线性表 1.数组实现 2.链表 二.栈与队列 三.树

0525.第一章:谈谈数据结构和算法这2个好基友[数据结构和算法]

本文为小甲鱼数据结构和算法教学视频的学习笔记 第一章:谈谈数据结构和算法这2个好基友 一.聊聊数据结构 1.为什么学数据结构?编程能力有质的飞越,不再停留在调用现成的API,做一个上档次的程序员. 2.什么是数据结构?数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科. 思考:好吧,简单来说程序设计 =数据结构 + 算法,数据结构就是关系,就是数据元素之间存在的一种或多种特定关系的集合. 3.数据结构分为逻辑结构和物理结构,前者指数据对象中数据元素之

数据结构与算法笔记 - 绪论

数据结构与算法笔记 - 绪论 1. 什么是计算2. 评判DSA优劣的参照(直尺)3. 度量DSA性能的尺度(刻度)4. DSA的性能度量的方法5. DSA性能的设计及其优化 x1. 理论模型与实际性能的差异x2. DSA优化的极限(下界) 计算机与算法 计算机科学(computer science)的核心在于研究计算方法与过程的规律,而不仅仅是作为计算工具的计算机本身,因此E. Dijkstra及其追随者更倾向于将这门科学称作计算科学(computing science). 计算 = 信息处理

《Java数据结构和算法》- 数组

Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new操作符: int [] objArray = null; // defines a reference to an array objArray = new int[100]; // creates the array, and sets objArray to refer to it 或使用等价的