程序是计算最大回文子序列
例如:acmerandacm
最大回文子序列:canac
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /**************************************************************** * Description: 2016_S_25 * Author: Alex Li * Date: 2023-09-07 11:44:05 * LastEditTime: 2023-09-07 12:22:39 ****************************************************************/ #include <iostream> using namespace std; int lps(string seq, int i, int j)//i是字符串左侧的起始点标识,j是字符串是右侧起始点标识 { int len1, len2; if (i == j)//如果i=j说明长度是1,回文长度也是1 return 1; if (i > j) //左边界大于右边界,区间不存在,返回0 return 0; if (seq[i] == seq[j])//[i]字符和[j]字符相同,回文数+2,左右各进一格,继续递归 return lps(seq, i + 1, j - 1) + 2; len1 = lps(seq, i, j - 1); //如果[i]和[j]字符不同,[j-1]右侧缩进一格,递归 len2 = lps(seq, i + 1, j); //如果[i]和[j]字符不同,[j+1]左侧缩进一格,递归 if (len1 > len2) return len1; return len2; //返回两个子串的最大值 } int main() { string seq = "acmerandacm"; //原始字符串 int n = seq.size(); //字符串大小 cout << lps(seq, 0, n - 1) << endl; //函数调用 return 0; } |