最长回文子串(Longest Palindromic Substring)——C++动态规划做法

题目描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:

示例1

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例2

输入: "cbbd"
输出: "bb"

C++程序

#include 
using namespace std;
string longestPalindrome(string s)
{
    int Size = s.size();
    //If the length of the string s is less than 2, the string itself is the longest palindrome string
    if (Size <= 1)
        return s;
    // dp[i][j],表示字符串s从s[i]到s[j]的子串为最长回文子串
    bool dp[s.length()][s.length()];
    //maxlen记录已经找到的最长回文子串的长度
    //start和end记录最长回文子串的起点位置和终点位置
    //动态规划的进行是按照字符串的长度从1到n推进的,k表示正在判断的子串的长度,用于和已知的最长子串的长度maxLen进行比较
    int maxlen = 1, start = 0, end = 0, i, j, k;
    //找出s的所有子串的dp对应的dp值,初始化过程
    for (i = 0; i < Size; i++)
        for (j = 0; j < Size; j++)
        {
            //当i==j的时候,只有一个字符的字符串
            //当i>j的时候认为是空串
            if (i >= j)
                dp[i][j] = 1;
            else
                dp[i][j] = 0;
        }
    for (k = 1; k < Size; k++)
    {
        for (i = 0; i + k < Size; i++)
        {
            j = i + k;
            if (s[i] != s[j])
                dp[i][j] = 0;
            else
            {
                dp[i][j] = dp[i + 1][j - 1];
                if (dp[i][j])
                {
                    //判断找到的子串的长度是否大于我们已知的最长子串的长度
                    if (k + 1 > maxlen)
                    {
                        //记录最长回文子串
                        maxlen = k + 1;
                        //记录子串的起始位置
                        start = i;
                        end = j;
                    }
                }
            }
        }
    }
    return s.substr(start, end - start + 1);
}
int main()
{
    string s = "ghjlabcdcbartyi";
    cout << longestPalindrome(s);
    // printf("\nThe progress was spent %.6lf second to finish\n",(double)clock()/CLOCKS_PER_SEC);
    return 0;
}

你可能感兴趣的:(动态规划,string,回文字符串,最长回文字符串)