LeetCode-5:最长回文子串

一、题目描述

在这里插入图片描述

二、解题思路

  • 首先,定义一个二维dp[len][len]布尔数组
  • dp[i][j]的值代表从s[i]s[j]的这个子串是否为回文串
  • 状态转移方程:dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j];
  • 解释:如果一个串是回文串,那么掐头去尾,剩下的也是回文串,同时头尾元素一定相同,只有这样才会是回文串

三、解题代码

class Solution {
public:
    string longestPalindrome(string s) {
        string sln;
        int len = s.size();
        if (!len)
            return sln;
        if (len == 1)
            return s;
        int MAX = 1;
        int rear = 0, prior = 0;
        bool dp[len][len];
        for (int i = 0; i < len; i++)
            dp[i][i] = true;
        for (int i = 1; i < len; i++) {
            for (int j = 0; j < len; j++) {
                if (i + j < len) {
                    if (i == 1)
                        dp[j][i + j] = (s[j] == s[i + j]);
                    else
                        dp[j][i + j] = (dp[j + 1][i + j - 1]) && (s[j] == s[i + j]);
                    if (dp[j][i + j]) 
                        if (i + 1 > MAX) {
                            MAX = i + 1;
                            rear = j;
                            prior = i + j;
                        }
                }
            }
        }
        sln = s.substr(rear, prior - rear + 1);
        return sln;
    }
};

四、运行结果

在这里插入图片描述

发布了30 篇原创文章 · 获赞 3 · 访问量 818

猜你喜欢

转载自blog.csdn.net/weixin_44587168/article/details/105324525