动态规划之最长回文子序列
来源:互联网 发布:spark源码下载 编辑:程序博客网 时间:2024/04/30 14:52
15-2(最长回文子序列) 回文(palindrome)是正序与逆序相同的非空字符串。例如,所有长度为1的字符串,civic,racecar,aibohphobia都是回文。设计高效算法,求给定输入字符串的最长回文子序列。例如,给定输入character,算法应该返回carac.算法的运行时间是怎么样的?
解题思路:首先我们要注意的是题目要求求出最长回文子序列,而不是子串。如果是子串,比如abcdebca,该回文子串长度为1,是其中任意一个字符,而回文子序列是abcdbca(abcebca).所以求子串和子序列有一些不同。以下方法只适用求子序列,求子串方法由于题目没有要求,这里暂且不提了。(PS:有些人可能不清楚子串和子序列的区别,这是要特别注意的问题。)
具体方法:只要把原字符串逆转后和原字符串比较并且利用求最长公共子序列的方式求出的LCS即可得到最长回文子序列。也就是说 求出的LCS=最长回文子序列。
代码如下:
#include <iostream>using namespace std;#define N 9//输入您要判断的字符串字符数char*strReversal(char*str){for (int i=0;i<N/2;i++){swap(str[i],str[N-i-1]);} return str;}char *b[N+2][N+2]={NULL};int c[N+2][N+2]={0};void Lcs_Length(char *x, char *y) {for (int i=0;i<N;i++){for (int j=0;j<N;j++){if (x[i]==y[j]){c[i+1][j+1]=c[i][j]+1;b[i+1][j+1]="↖";} else{if (c[i][j+1]>=c[i+1][j]){c[i+1][j+1]=c[i][j+1];b[i+1][j+1]="↑";} else{c[i+1][j+1]=c[i+1][j];b[i+1][j+1]="←";}}}}}void PRINT_LCS(char*x,int i,int j){if (i==0||j==0){return;}if (b[i][j]=="↖"){PRINT_LCS(x,i-1,j-1);cout<<x[i-1]<<" ";}else{if (b[i][j]=="↑"){PRINT_LCS(x,i-1,j);} else{PRINT_LCS(x,i,j-1);}}}void main(){//为了和书中代码吻合,数组第一个位置存放空字符。 char x[N+1]={0};char y[N+1]={0};char c;cout<<"提示:输入字符串之前,根据需要设置N大小"<<endl; cout<<"请输入需要判断的字符串:"<<endl;for (int i=0;i<N;i++){cin>>c;y[i]=x[i]=c;}y[i]='\0';x[i]='\0';strReversal(y);//反转字符串cout<<"x="<<x<<endl;cout<<"y="<<y<<endl;Lcs_Length(x, y);PRINT_LCS(x,N,N);}
样例输出:
最后总结:求LCS需要O(n²)时间,求字符串的逆转需要O(n)时间,总得来说本程序只需要O(n²)时间。这个问题还是较为简单的,仅仅是把书中例子改改即可得到所需结果。
0 0
- 动态规划之最长回文子序列
- 算法导论 动态规划之最长回文子序列
- (动态规划)最长回文子序列、回文子序列个数
- (动态规划)最长回文子序列、回文子序列个数
- 动态规划-最长回文子序列
- 动态规划(11)-最长回文子序列
- 动态规划求最长回文子序列
- 动态规划--最长回文子序列
- 动态规划-最长回文子序列
- 算法导论——动态规划之最长公共子序列(LCS)和最长回文子序列(LPS)
- POJ 1159 Palindrome(动态规划:最长回文子序列)
- 动态规划——最长回文子序列
- 回文字符串 (动态规划,最长公共子序列)
- 动态规划(二)最长回文子序列
- 最长公共子序列&回文字符串 nyoj动态规划
- 最长子序列和回文字符串(动态规划)
- 动态规划之最长公共子序列
- 动态规划之最长递增子序列
- Zend Guard 5 详细的使用配置教程
- MFC源代码的头文件源文件切换,以及源代码的挖掘和学习
- c/c++进阶之路
- 学生信息管理系统错误集锦(二)
- 网站改版后导致URL改变如何设置301跳转的几种方法
- 动态规划之最长回文子序列
- 公约数和公倍数
- 为什么android源码中有的public方法,在官网会查不到并且我们也用不了?
- LeetCode——Convert Sorted Array to Binary Search Tree
- vim使用(三):.viminfo和.vimrc
- 类加载器和委托机制的理解
- PHP实现Unicode和Utf-8互相转换
- krpano 教程 - 自动旋转和自动场景跳转的实现
- 未决寄存器置1怎么区分是中断请求还是清中断