标签:font 描述 images 依赖 character char lin 打印 mic
一、问题的描述
回文序列(Palindromic sequence, Palindrome)是指正向遍历和反向遍历完全相同的序列,例如字符串“AAAAA”显然是一个回文序列,又如字符串“ABC@CBA”也是一个回文序列。现在,我们要在一个(字符)序列中找出最长回文子序列的长度。例如字符序列"BBABCBCAB",最长回文子序列是“BACBCAB”(可能不唯一),它的长度是7;子序列"BBBBB"和"BBABB"虽然也是回文序列,但却不是最长的,因此不合题意。
二、分析
#include<iostream> #include<cmath> #include<algorithm> using namespace std; #define MAX 100 int f[MAX][MAX] = { 0 }; int b[MAX][MAX] = { 0 }; int flag = 0; void Lps_length(string &str) { int len = str.length(); for (int i = len - 1; i >= 0; --i) { f[i][i] = 1; for (int j = i+1; j < len; ++j) { if (str[i] == str[j]) { f[i][j] = f[i + 1][j - 1] + 2; b[i][j] = 0; } else if (f[i + 1][j] >= f[i][j - 1]) { f[i][j] = f[i + 1][j]; if(f[i + 1][j] == f[i][j - 1]) b[i][j] = 2; else b[i][j] = -1; } else { f[i][j] = f[i][j - 1]; b[i][j] = 1; } } } } void printf_Lps(int b[MAX][MAX],int i,int j,const string &str) { if (i < 0 || j < 0) { return; } if (b[i][j] == 0) { if (j >= 0 && j <= str.length() - 1) { cout << str[j]; } if (i == j) { flag = 1; } if(flag == 0) printf_Lps(b, i + 1, j - 1,str); else printf_Lps(b, i - 1, j + 1, str); } else if (b[i][j] == 2 || b[i][j] == 1) { if (flag == 0) printf_Lps(b, i, j - 1,str); else printf_Lps(b, i, j + 1, str); } else if(b[i][j] == -1) { if (flag == 0) printf_Lps(b, i + 1, j,str); else printf_Lps(b, i - 1, j, str); } } int main() { string str = "GTJYTTHA"; Lps_length(str); for (int i = 0; i <= str.length ()-1; ++i) { for (int j = 0; j <= str.length() - 1; ++j) { cout << b[i][j] << "\t"; } cout << endl; } cout << f[0][str.length() - 1] << endl; printf_Lps(b, 0, str.length() - 1,str); cout << endl; return 0; }
上述代码在计算最长回文子序列的长度时计算都是正确的,但是在打印最长回文子序列时有时出现问题,比如在输入character时,输出的是 cara ,而不是carac,调试了很久,也找不出问题,伤心,哪位网友要是看出来问题在哪请留言问题在哪,万分感谢
调试bug是一个痛苦的过程
夜深了,
标签:font 描述 images 依赖 character char lin 打印 mic
原文地址:http://www.cnblogs.com/1242118789lr/p/7412235.html