利用最长公子序列求回文字符串
2014-08-17 14:35
225 查看
【题目来源】poj1159
【题目含义】给定一个字符串,问最少插入多少字符使该字符串变成回文字符串。
【题目分析】解决该题目的一个关键是在于发现该公式:
设原字符串序列为 X ,逆序列为 Y ,则最少需要补充的字母数 = X 的长度 - X 和 Y 的最长公共子序列的长度。
有了这个公式,那么这个题目就简单了很多,由于题目内存限制,该题还需要进行内存压缩。
【代码】
【题目含义】给定一个字符串,问最少插入多少字符使该字符串变成回文字符串。
【题目分析】解决该题目的一个关键是在于发现该公式:
设原字符串序列为 X ,逆序列为 Y ,则最少需要补充的字母数 = X 的长度 - X 和 Y 的最长公共子序列的长度。
有了这个公式,那么这个题目就简单了很多,由于题目内存限制,该题还需要进行内存压缩。
【代码】
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #define mem(x) memset((x),0,sizeof((x))) #define MAXN 10+5000 using namespace std; char str[MAXN]; char str2[MAXN]; int dp[2][MAXN]; void LCS(char *str1,char *str2,int n) { mem(dp); // int ans = 0; int t = 0; for(int i = 0; i < n; i++){ t = 1 - t; for(int j = 0; j < n; j++){ //dp[(i+1)%2][j+1] = max(dp[i%2][j+1],dp[(i+1)%2][j]); //此处也可用取余操作 dp[t][j+1] = max(dp[1-t][j+1],dp[t][j]); if(str1[i] == str2[j]){ dp[t][j+1] = max(dp[1-t][j] + 1,dp[t][j+1]); // ans = max(ans,dp[(i+1)%2][j+1]); //可以利用ans保存最后结果 } } } // cout<< n - ans <<endl; cout<< n - dp[n%2] <<endl; } int main() { int n; while(cin>>n){ scanf("%s",&str); mem(str2); for(int i = 0, j = n-1; i < n; i++,j--){ str2[j] = str[i]; } LCS(str,str2,n); } return 0; }
相关文章推荐
- 利用Manacher算法寻找字符串中的最长回文序列(palindrome)
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 求字符串最长不连续回文序列的深入研究
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 求给定字符串中最长回文序列
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理
- 找工作知识储备---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- ] 找工作知识储备(2)---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 求一个字符串中的最长回文序列
- 求字符串最长不连续回文序列的深入研究
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)
- 【算法】寻找字符串中最长的回文序列
- 找工作知识储备(2)---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 字符串系列之最长回文子串