插入最少的字符使字符串成为回文串 <最长公共子序列 + 回文>
来源:互联网 发布:centos samba安装 编辑:程序博客网 时间:2024/06/04 23:30
题目描述
给定一个字符串S,可以通过在字符串的任意位置插入字符,使其变为回文串。求最少插入字符的数量。
例如:
ab -> bab 1
aa -> aa 0
abca -> acbca 1
题目来源:微信号 待字闺中
解题思路
如果能在原串S中找到最长的子序列L,这个子序列是回文,那么我们就能知道要插入多少个字符是的原串成为回文。
ans = strlen(s) - strlen(L)
问题转为求一个字符串的最长回文子序列,这个问题可以使用最长公共子序列的解法,解法如下:
1.求S的逆序串 S',;
2.那么S和S'的用求最长公共子序列L,L即为S的最长回文子序列(这个规律是在推演中发现的);
3.那么问题得解:ans = strlen(s) - strlen(L)。
例如: S = abca 那么 S' = acba ,那么L = aba 那么答案就是1.即 a’c‘bca。其中'c'为插入的字符。
算法分析
该算法的核心是求最长公共子序列,最长公共子序列有DP的求法,算法的复杂度是 时间和空间都是 O(n^2)
解法二
原作者提供
主要采用动态规划,动态规划主要从两端字符进行比较,因而有重复子问题。
假设将问题表示为公式S(0,n-1),那么
if(a[0] = a[n-1])
s(0,n-1) == s(2,n-2)
else
s(0,n-1) == min( s(1,n-2) , s(2,n-1) ) + 1
s(0,n-1) == s(2,n-2)
else
s(0,n-1) == min( s(1,n-2) , s(2,n-1) ) + 1
其中a[i]为串S中的第i个字符。
#include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #define Max(a,b) (a)>(b)?(a):(b) using namespace std; char s1[1010],s2[1010]; int c[1010][1010]; int LCS(char *a,char *b) { int i,j,len = strlen(a); //for(i=0;i<=len;i++) c[i][0] = c[0][i] = 0; for(i=1;i<=len;i++){ for(j=1;j<=len;j++){ if(a[j-1]==b[i-1]) c[i][j] = c[i-1][j-1] + 1; else c[i][j] = Max(c[i-1][j],c[i][j-1]); } } return c[len][len]; } int main() { int n,i,j,len; scanf("%d",&n);getchar(); while(n--) { memset(c,0,sizeof(c)); gets(s1); len = strlen(s1); for(i=len-1,j=0;i>=0;i--,j++) s2[j]=s1[i]; s2[j] = '\0'; printf("%d\n",len-LCS(s1,s2)); } return 0; }
0 0
- 插入最少的字符使字符串成为回文串 <最长公共子序列 + 回文>
- 插入最少的字符使字符串成为回文串
- 插入最少的字符使字符串成为回文
- 回文串,即abcba类型,输入一个字符串,输出要插入的最少字符个数使之成为回文串
- 【jzoj4889】【最长公共回文子序列】【字符串】
- 回文字符串【最长公共子序列】【DP】
- 回文字符串-最长公共子序列
- 最长回文子串、回文子序列、公共子序列
- 通过最长公共子串求得使得一个串变为回文串的最少添加字符
- 插入最少字符成为回文串
- 求两字符串最长公共子序列LCS的应用—删除字符串的字符剩下回文串
- 添加最少字符使成为回文字符串
- 【动态规划】LCS算法:求两字符串最大公共子序列/删除字符使成为回文串
- 最长公共子串、最长公共子序列、最长回文子串、最长回文子序列、回文子串个数
- 添加最少的字符使字符串成为回文
- 最长公共回文子序列
- 字符串的最长回文子序列以及最长子串
- 删除最少字符 使字符串成为回文串
- ActiveMQ入门示例讲解
- DL学习笔记【11】caffe参数调节-loss层
- 像微信的底部菜单栏被键盘挤上去
- 硬件及OS知识培训List
- 网络爬虫项目开发日志(二):爬虫架构设计
- 插入最少的字符使字符串成为回文串 <最长公共子序列 + 回文>
- 70. Climbing Stairs
- DataTable 与 datagrid控件
- Eclipse调试(2)——各种类型断点设置
- CentOS 6.7安装ElasticSearch2.3.4
- 利用Hierarchy Viewer优化布局
- Windows7 64位安装Requests
- Redis Cluster 3.0.5 集群实战
- 【OpenCV笔记 14】OpenCV图像增强方法直方图均衡化