C++ | dp | #最长回文子串#

最长回文子串

https://www.nowcoder.com/practice/12e081cd10ee4794a2bd70c7d68f5507

dp解法
以adadd为例
第一个循环记录字母本身,如a开始到a,为1,d开始到d,为1
第二个循环记录相邻的字母是否会回文,如ad不行记录为0,dd可以,记录为2
第三个循环dp,对于dp[i][j],也就是从第i个到第j个字符串是否回文,首先要第i个字符和第j个字符相等,然后要第i+1个字符到第j-1个字符是回文,如果满足,则等于dp[i+1][j-1]+2
第四个循环寻找最长回文
#include <iostream>
#include <string>
using namespace std;
int main(void) {
    string s;
    cin >> s;
    int n = s.size();
    int m = 0;
    int dp[350][350];   //分别表示开始和终止,用矩阵一半的地方表示
    for (int i = 0; i < n; i++)
        dp[i][i] = 1;
    for (int i = 0; i < n - 1; i++)
        dp[i][i + 1] = s[i + 1] == s[i] ? 2 : 0;
    for (int i = n - 3; i >= 0; i--)
        for (int j = i + 2; j < n; j++)
            dp[i][j] = s[i] == s[j] && dp[i + 1][j - 1] ? dp[i + 1][j - 1] + 2 : 0;
    for (int i = 0; i < n; i++)
        for (int j = i; j < n; j++)
            m = m > dp[i][j] ? m : dp[i][j];
    cout << m;
    return 0;
}


全部评论

相关推荐

AC鸽想进大厂:你是我见过最美的牛客女孩
点赞 评论 收藏
分享
三轮业务+一轮HR&nbsp;俺有点没招了。。。
此刻我身在乌云中:hr打电话问我能不能提前实习,我说不可以,然后他说那可能要横向排序等结果。结果五分钟立马挂了
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务