题目大意:
给你一个字符串,问最少添加多少个字符,使原字符串变成回文串
思路:
回文串的性质是倒过来两者一样, 那么有这个性质可知, 设原始字符串为a,原始字符串颠倒过来的字符串为b, 那么求a和b的最长公共子序列, 字符串a的长度减去最长公共自序列的长度不就是最少添加的字符!
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 107;
char a[N], b[N];
int dp[N][N];
void solve()
{
scanf(" %s",a);
int len = (int)strlen(a);
for(int i=0; i<len; i++)
b[len-1-i] = a[i];
memset(dp, 0, sizeof(dp));
for(int i=0; i<len; ++i)
{
for(int j=0; j<len; ++j)
{
if(a[i] == b[j])
dp[i+1][j+1] = dp[i][j] + 1;
else
dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j]);
}
}
printf("%d\n",len - dp[len][len]);
}
int main()
{
int T;
scanf("%d",&T);
for(int i=1; i<=T; i++)
{
printf("Case %d: ", i);
solve();
}
return 0;
}
本文介绍了一种求解最少添加多少个字符使任意字符串变为回文串的方法。利用最长公共子序列的思想,通过字符串与其反转后的字符串进行比较,得出需要添加的字符数量。
1041

被折叠的 条评论
为什么被折叠?



