编程题--最长公共子序列
来源:互联网 发布:淘宝邀请的活动好不好 编辑:程序博客网 时间:2024/06/10 01:47
题目:给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
思路:提到回文串,自然要利用回文串的特点,想到将源字符串逆转后,“回文串”(不一定连续)相当于顺序没变
求原字符串和其反串的最大公共子序列(不是子串,因为可以不连续)的长度(使用动态规划很容易求得),然后用原字符串的长度减去这个最大公共子串的长度就得到了最小编辑长度。
最长公共子序列的动态规划递推方程:
代码:
#include<iostream>#include<string>#include<vector>using namespace std;//计算公共子序列长度void LCS(string s1,string s2) { int size1 = s1.size()+1; int size2 = s2.size()+1; vector<vector<int>> matrix(size1, vector<int>(size2)); //初始化边界 for (size_t i = 0; i < size1; i++) { matrix[i][0] = 0; } for (size_t j = 0; j < size2; j++) { matrix[0][j] = 0; } //递推 for (size_t i = 1; i < size1; i++) { for (size_t j = 1; j < size2; j++) { if (s1[i-1] == s2[j-1]) matrix[i][j] = matrix[i - 1][j - 1]+1; else { if (matrix[i - 1][j] < matrix[i][j - 1]) matrix[i][j] = matrix[i][j - 1]; else matrix[i][j] = matrix[i - 1][j]; } } } cout << s1.size() - matrix[size1 - 1][size2 - 1]<<endl;}int main() { string s; while (cin >> s) { int len = s.size(); char* rev = new char[len + 1]; //反转字符串 for (size_t i = 0; i < len; i++) { *(rev + i) = s[len - 1 - i]; } *(rev + len) = '\0'; string s2(rev); //s2是s反转后的字符串,这两个字符串的最长公共子序列就是s的最长的回文序列 LCS(s, s2); }}
阅读全文
0 0
- 编程题--最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列...
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- nginx和anglar结合
- 解析su,su -,sudo的区别
- hud神,上帝及老天爷
- 匆匆结束的大学两年
- Codeforces 821D Okabe and City (拆点+思维建图+spfa)
- 编程题--最长公共子序列
- eclipse导入SVN上的Maven多模块项目
- HDU1728 逃离迷宫 BFS
- 虚拟机类初始化机制
- Android 仿iphone提醒事项(三)
- 区别多态和重载
- ffmpeg视频分割,视频合成
- BZOJ 1458: 士兵占领 最大流 题解
- 用JavaScript来实现队列