【C++ | PTA】最长对称子串

该文章介绍了一种使用动态规划求解最长对称子串问题的方法。通过初始化所有长度为1的子串为回文串,然后逐次增加区间长度并检查边界及内部字符,找出最长的对称子串。在给定的例子中,最长对称子串是sPAT&TAPs,长度为11。代码示例使用了C++实现。

文章目录

题目要求

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。

输入格式:
输入在一行中给出长度不超过1000的非空字符串。

输出格式:
在一行中输出最长对称子串的长度。

输入样例:
Is PAT&TAP symmetric?

输出样例:
11

代码

#include <iostream>
#include <cstring>

using namespace std;

const int N = 1010;

int dp[N][N];

int main()
{
    string s;
    getline(cin, s);    // 输入字符串

    int n = s.size(), ans = 0;

    // 如果长度小于等于1,直接输出长度即可
    if (n <= 1) 
    {
        cout << n << endl;
        return 0;
    }

    // 初始化:所有长度为1的子串都是回文串
    for (int i = 0; i < n; i++) 
        dp[i][i] = true;

    // 遍历字符串,先枚举区间长度,再枚举起始位置
    for (int len = 2; len <= n; len++) 
        for (int i = 0; i + len - 1 < n; i++) 
        {
            int j = i + len - 1;      // 区间右边界

            if (s[i] == s[j])         // 如果左右边界相同
            {
                if (len == 2 || dp[i + 1][j - 1])    // 如果区间长度为2或左右边界内部也是回文串
                    dp[i][j] = true;
            }

            if (dp[i][j])      // 记录最长回文子串长度
                ans = max(ans, len);
        }

    cout << ans << endl;     // 输出结果

    return 0;
}

dp[i][j] 表示从第 i 个字符到第 j 个字符是否为回文串。
在代码实现中,先对所有长度为1的子串进行初始化,然后依次枚举区间长度和起始位置来填充整个 dp 数组。如果当前区间左右边界相同,则需要判断左右边界内部是否也是回文串。最终找到最长回文子串的长度并输出即可。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值