题解 | #密码截取#

密码截取

https://www.nowcoder.com/practice/3cd4621963e8454594f00199f4536bb1

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main() {
    // 最长连续回文串
    string str;
    while(getline(cin, str)) {
        int n = str.size();
        vector<vector<int>> dp(n, vector<int>(n,0));
        int  ans = 0;

        for (int i = 0; i < n; i++)
            dp[i][i] = 1;

        for (int len = 2; len <= n; len++) {
            for (int i = 0; i <= n-len; i++) {
                if (len == 2) {
                    dp[i][i+1] = str[i] == str[i+len-1] ? len:0;
                } else {
                    if (str[i] == str[i+len-1]) {
                        if (dp[i+1][i+len-2] > 0)
                            dp[i][i+len-1] = dp[i+1][i+len-2]+2;
                    }
                }
                ans = max(ans, dp[i][i+len-1]);
                // cout << i << "," << i+len-1 << ":" << dp[i][i+len-1] << endl;
            }
        }
        cout << ans << endl;
    }
}
// 64 位输出请用 printf("%lld")

动态规划,求最长连续回文串

需要注意的是,

第一层for循环变量是字串的长度,从2到n

第二层for循环是字串起始位置,从0到n-len

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务