构造回文--最长回文子序列

本文介绍了一种使用动态规划解决字符串问题的方法,旨在找出给定字符串中能构成的最长回文子序列,并通过计算最少删除字符数来实现。文章提供了一个C++实现示例,演示了如何通过反转字符串并与原始字符串比较来找到最长公共子序列,从而确定所需删除的字符数量。

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

Description:

时间限制:1秒

空间限制:32768K

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。

输入描述:

输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.

输出描述:

对于每组数据,输出一个整数,代表最少需要删除的字符个数。


输入例子1:
abcda
google

输出例子1:
2
2


动态规划Solution:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
 
// same_at_pos[i][j]表示在字符串s1的i位和s2的j位之前两个串的最长公共子序列的长度
int same_at_pos[1001][1001];
 
int longestSame(string s1, string s2) {
    for (int i = 0; i < s1.length(); i++) {
        same_at_pos[i][0] = 0;
        same_at_pos[0][i] = 0;
    }
     
    for (int i = 1; i <= s1.length(); i++) {
        for (int j = 1; j <= s2.length(); j++) {
            if (s1[i-1] == s2[j-1]) {
                same_at_pos[i][j] = same_at_pos[i-1][j-1] + 1;
            } else {
                same_at_pos[i][j] = max(same_at_pos[i-1][j], same_at_pos[i][j-1]);
            }
        }
    }
    return same_at_pos[s1.length()][s2.length()];
}
 
int main() {
    string str;
    string reverse_str;
    int sameLen = 0;
    while (cin >> str) {
        reverse_str = str;
        // 反转输入的字符串
        reverse(reverse_str.begin(), reverse_str.end());
        // 求反转后的串与原字符串的最长公共子序列的长度
        sameLen = longestSame(str, reverse_str);
        // 为了得到最长公共子序列所需要去掉的字母数
        cout << str.length() - sameLen << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值