Geeks面试题: Longest Common Subsequence (LCS)

标签: geeks 面试 longest | 发表时间:2014-01-01 16:17 | 作者:kenden23
出处:http://blog.csdn.net

Longest Common Subsequence

We have discussed Overlapping Subproblems and Optimal Substructure properties in  Set 1 and  Set 2respectively. We also discussed one example problem in  Set 3. Let us discuss Longest Common Subsequence (LCS) problem as one more example problem that can be solved using Dynamic Programming.

LCS Problem Statement: Given two sequences, find the length of longest subsequence present in both of them. A subsequence is a sequence that appears in the same relative order, but not necessarily contiguous. For example, “abc”, “abg”, “bdf”, “aeg”, ‘”acefg”, .. etc are subsequences of “abcdefg”. So a string of length n has 2^n different possible subsequences.

It is a classic computer science problem, the basis of  diff (a file comparison program that outputs the differences between two files), and has applications in bioinformatics.

Examples:
LCS for input Sequences “ABCDGH” and “AEDFHR” is “ADH” of length 3.
LCS for input Sequences “AGGTAB” and “GXTXAYB” is “GTAB” of length 4.

- http://www.geeksforgeeks.org/dynamic-programming-set-4-longest-common-subsequence/



递归法:

int lcs(char *c1, int m, char *c2, int n)
{
	if (m == 0 || n == 0) return 0;

	if (c1[m-1] == c2[n-1])
	{
		return 1 + lcs(c1, m-1, c2, n-1);
	}
	else
	{
		return max(lcs(c1, m-1, c2, n), lcs(c1, m, c2, n-1));
	}
}

二维动态规划法:

int lcsDP(char *c1, int m, char *c2, int n)
{
	vector<vector<int> > ta(m+1, vector<int>(n+1));

	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (c1[i] == c2[j]) ta[i+1][j+1] = ta[i][j]+1;
			else
			{
				ta[i+1][j+1] = max(ta[i][j+1], ta[i+1][j]);
			}
		}
	}
	return ta[m][n];
}

2个一维表:

int lcsDP2(char *c1, int m, char *c2, int n)
{
	vector<vector<int> > ta(2, vector<int>(n+1));
	bool flag = false;

	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (c1[i] == c2[j])
			{
				ta[flag][j+1] = ta[!flag][j] + 1;
			}
			else
			{
				ta[flag][j+1] = max(ta[!flag][j+1], ta[flag][j]);
			}
		}
		flag = !flag;
	}
	return ta[!flag][n];
}

终极省内存,一个一维表:

int lcsDP3(char *c1, int m, char *c2, int n)
{
	vector<int> ta(n+1);
	int t1 = 0;
	int t2 = 0;

	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			t2 = ta[j+1];
			if (c1[i] == c2[j])
			{
				ta[j+1] = t1+1;
			}
			else
			{
				ta[j+1] = max(ta[j], t2);
			}
			t1 = t2;
		}
		t1 = 0;
	}
	return ta[n];
}

测试:

int main()
{
	char X[] = "AGGTAB";
	char Y[] = "GXTXAYB";

	int m = strlen(X);
	int n = strlen(Y);

	printf("Length of LCS is %d\n", lcsDP2( X, m, Y, n ) );

	system("pause");
	return 0;
}




作者:kenden23 发表于2014-1-1 8:17:18 原文链接
阅读:32 评论:0 查看评论

相关 [geeks 面试 longest] 推荐:

Geeks面试题: Longest Common Subsequence (LCS)

- - CSDN博客推荐文章
It is a classic computer science problem, the basis of  diff (a file comparison program that outputs the differences between two files), and has applications in bioinformatics..

最长公共子串 Longest Common Subsequence

- - CSDN博客推荐文章
package DP; import java.util.Arrays; // 最长公共子串 Longest Common Subsequence public class LCS {. // 纯递归O(m*2^n). // 如果已经存在dp数组中,直接返回. // 把新值记录到dp数组中. 作者:hellobinfeng 发表于2013-10-27 10:39:12 原文链接.

变态面试

- Tony - 叫兽与你同在

RoBa:Facebook 面试 Q&A

- - 博客 - 伯乐在线
前言:本文作者 RoBa ,据其个人博客中简绍是在腾讯北京搜索部门做后台开发工作. 他最近拿到 Facebook 入职 Offer 后,不少读者对此事有些提问. 本文是 Roba 做的问题答复总结. 说实话,其实我的眼界从来很狭窄,以前想的是,如果能在天朝帝都扎下脚跟,过上老婆孩子热炕头的日子,对我来说已很满足.

Hibernate面试题

- - ITeye博客
什么是Hibernate的并发机制. Hibernate并发机制:. a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次,. 如果一个Session 实例允许共享的话,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用.

java面试题

- - Java - 编程语言 - ITeye博客
 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面. 抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节. 抽象包括两个方面,一是过程抽象,二是数据抽象.  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法. 对象的一个新类可以从现有的类中派生,这个过程称为类继承.

面试技巧

- - 非技术 - ITeye博客
问题一:“请你自我介绍一下” .   1、这是面试的必考题目.   2、介绍内容要与个人简历相一致.   3、表述方式上尽量口语化.   4、要切中要害,不谈无关、无用的内容.   5、条理要清晰,层次要分明.   6、事先最好以文字的形式写好背熟. 问题二:“谈谈你的家庭情况” .   1、 况对于了解应聘者的性格、观念、心态等有一定的作用,这是招聘单位问该问题的主要原因.

SQL Server 面试

- - SQL - 编程语言 - ITeye博客
在SQL语言中,一个SELECT…FROM…WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句中的查询称为子查询. 子查询分为嵌套子查询和相关子查询两种. 嵌套子查询的求解方法是由里向外处理,即每个子查询在其上一级查询处理之前求解,子查询的结果作为其父查询的查询条件. 子查询只执行一次,且可以单独执行;.

面试总结

- - A programmer's life
最近我在找工作,面试了多家公司:百度、阿里、小米、美团、Yahoo、Symantec、Amazon. 其中Amazon面的是供应链(被HR忽悠的),fail了. 其它拿到了offer,但是都有些不如意. 很多公司给我的薪水和职级只相当于毕业1-2年的人的水平,而我已经毕业7年了,所以这些公司的尽管给我发了offer,在我看来他们不过是婉拒了我.

Google的面试题

- Far Soul - 东西
在Google找工作应该是一件非常困难的事. 据统计,Google每年接收的简历有超过100万份,其中只有0.01%-0.04%的人会被录取. Google录取员工的流程有九项:评审筛选、电话筛选、在线面试、面试反馈、录取会议、中层领导复审、薪酬会议、中层领导再最终复审、录取通知书. 这其中每一项都是经过大家投票决定的.