回文词

该博客介绍了一个关于回文词的问题,即如何在给定字符串中找到需要插入的最少字符数来使其变为回文词。博主通过示例解释了问题,并提出通过计算字符串及其反串的最长公共子序列来解决此问题,最后提到了使用动态规划(DP)的方法来实现这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

回文词是一种对称的字符串。也就是说,一个回文词,从左往右和从右往左读得到的结果是一样的。任意给定一个字符串,通过插入若干字符,都可以变成一个回文词。本题的任务是写一个程序,求出将给定字符串变成回文词所需插入的最少字符数。

比如字符串“Ab3bd“,在插入两个字符后可以变成一个回文词(”dAb3bAd“”Adb3dbA“)。然后,插入两个以下的字符无法使他变成一个回文词。

输入

第1行1个正整数N,表示给定字符串的长度,3<=N<=5000。

第2行是一个长度为N的字符串。字符串仅由大写字母、小写字母和数字构成。大写字母和小写字母是可区分的。

输出

一行一个整数,表示需要插入的最少字符。

样例输入

5
Ab3bd

样例输出

2

思路

设读入串为s,其反串为k,则显而易见,strlen(s)为最大答案,将s、k拼合就是最大答案的状态。设t=sk,显然,从s、k中同时去除相同的子序列,t仍然保持对称性还是回文,于是问题转化成:求s和其反串k的最长子序列?,很显然strlen(t)减其最长子序列长度为答案。求长子序列DP一下就完事了。

代码

#include <cstdio>
#include <iostream>
using namespace std;
int n,ans,f[5001][5001];//f[i][j]为s数组的前i个数与k数组前j个个数所组成的最长子序列 
char s[5001],k[5001];
int main() {
    scanf("%d\n",&n);
    for(int i=1; i<=n; i++)s[i]=getcha
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值