赞
踩
最长公共子序列(LCS)递归算法实现
描述:给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列 ,则返回 0 。
注意:一个字符串的子序列是指将原字符串抽出一些字符(抽出的字符的相对顺序不发生改变)后组成新字符串。
例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。
两个字符串的公共子序列是这两个字符串所共同拥有的子序列。
俗话说的好,人理解迭代,神理解递归。
对于序列A[0,n],B[0,n],LCS(A,B)无非三种情况:
0)n<=0或m<=0,则结果为空序列,返回0(这其实就是递归基);
1)A[n] = ‘x’ = B[m],则返回LCS(A[0,n),B[0,m))+‘x’;因为x是他们公共子序列的一部分,所以可以记录下来,同时将原字符串都减去这个x,将问题简化(减而治之);
2)A[n]≠B[m],则返回LCS(A[0,n],B[0,m))与LCS(A[0,n),B[0,m])的更长者;因为两字符串的末尾都不相同,则最少有一个字符串末尾的字符对最长公共子序列没有贡献,所以可以删掉这个字符,将问题简化(减而治之与分而治之——递归的思路);
代码如下:
class Solution { public: int LCS(string text1, string text2) { if (text1.size() == 0 || text2.size() == 0) { return 0; } int len1=text1.size(),len2 = text2.size(); if(text1[len1-1]==text2[len2-1]) { text1.pop_back(); text2.pop_back(); return LCS(text1,text2)+1; } else { string text11 = text1; text11.pop_back(); string text22 = text2; text22.pop_back(); return LCS(text11,text2)>LCS(text1,text22) ? LCS(text11,text2) : LCs(text1,text22) ; } } };
感想:递归算法确实可以很好的理解问题,思路也很简单。但其效率实在是太低了,我自己测试的一个例子当我写完这篇文章时还没算出来。所以这里只是帮你更深入的理解一下递归。至于更好的算法是动态规划。如果有做的不好的地方,欢迎指出来。关注我,一起成为更好的自己吧!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。