UVA 11151 Longest Palindrome (最大回文串)

本文介绍了一种通过计算最长公共子序列(LCS)来找出字符串中最长回文子序列的方法,该方法适用于非连续字符的情况,从而实现通过最少删除使任意字符串变为回文串的目标。

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

这里面读题一定要精准,首先它说的是从一个string里面take away一些字符,使得剩下的字符成为一个palindrome,这里求的是palindrome的最大长度,那么也就是说删除最少的字符使得这个string成为一个palindrome,并且可是在原串不连续的。

那么这个道题和之前做的longest palindrome还有有区别的,之前一定是substring,表示一定是在原串中连续的,及连通的,这个不一定。

那么如果是palindrome的话,那么从前往后和从后往前都是一样的,朋友说求一下本串和逆串的最大公共子序列,没有错,就是这样的,在本串中存在,在逆串中也存在,那么就说明从前读和从后读是一样的,而LCS就是最大palindrome了!

代码如下:

//LCS
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

int c[1000][1000], T;
string s, ss;

int main()
{
    scanf("%d", &T);
    getchar();
    while ( T-- ) {
        getline( cin, s );
        if ( s == "" ) {
            printf("0\n");
            continue;
        }
        ss.clear();
        for ( int i = s.size() -1; i >= 0; ss += s[i], --i );
        memset( c, 0, sizeof(c) );
        int n = ss.size();
        for ( int i = 1; i <= n; ++i ) 
            for ( int j = 1; j <= n; ++j ) {
                if ( s[i-1] == ss[j-1] ) c[i][j] = c[i-1][j-1] + 1;
                else c[i][j] = max( c[i-1][j], c[i][j-1] );
            }
        printf("%d\n", c[n][n]);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值