LeetCode 5.最长回文子串

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;

/*
* 思路:动态规划问题,用一个二维数组记录是否回文,初始化长度为1和为2的两种情况,接着按长度循环
* 若s[i]=s[j]且dp[i+1][j-1]=1(回文),则当前长度的回文,记录下最长长度,脱离循环后进行单次查找即可
* 注意:设置全局二维数组会通不过leetcode测试用例(不知道为啥,但网页测试结果和最终执行结果不一样)
*/
class Solution {
public:
    string longestPalindrome(string s) {
        int size = s.length(), len = 3, max_len = 1;
        vector<vector<int>> dp(size, vector<int>(size));
        // 初始化长度为1和长度为2的两种特殊情况
        for (int i = 0; i < size; i++)
            dp[i][i] = 1;
        for (int i = 0; i < size - 1; i++)
        {
            if (s[i] == s[i + 1])
            {
                dp[i][i + 1] = 1;
                max_len = 2;
            }
        }
        for (; len <= size; len++)
        {
            bool flag = false;
            for (int i = 0; i <= size - len; i++)
            {
                int j = i + len - 1;
                if (dp[i + 1][j - 1] == 1 && s[i] == s[j])
                {
                    dp[i][j] = 1;
                    // 当前遍历长度找到符合要求的回文子串,则标记一下
                    flag = true;
                }
            }
            if (flag)
            {
                max_len = len;
            }
        }
        for (int i = 0; i <= size - max_len; i++)
        {
            if (dp[i][i + max_len - 1] == 1)
            {
                return s.substr(i, max_len);
            }
        }
        return "";
    }
};

int main()
{
    string s;
    cin >> s;
    Solution A;
    cout << A.longestPalindrome(s) << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值