5.最长回文子串

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

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
 /*动态规划的核心是找到状态转移公式,这道题的状态转移明显是若一个子串是回文子串
    且这个子串的前一个字符与后一个字符相同,则回文子串长度加2;
    想办法表示一个状态:isPalindrome[i][j]=true表示下标从i到j的子串是回文子串*/
    string longestPalindrome(string s) {
        int n=s.size();
        bool **isPalindrome=new bool*[n];
        for(int i=0;i<n;++i){
            isPalindrome[i]=new bool[n];
            memset(isPalindrome[i],0,n);
        }
        int start=0,maxLength=1;
        for(int j=0;j<n;++j){
            for(int i=0;i<=j;++i){
                if(j-i<2) isPalindrome[i][j]=(s[i]==s[j]);
                else {
                    isPalindrome[i][j]=(s[i]==s[j]&&isPalindrome[i+1][j-1]);
                }
                if(isPalindrome[i][j]==true&&j-i+1>maxLength) {
                    start=i;
                    maxLength=j-i+1;
                }
            }
        }
        return s.substr(start,maxLength);        
    }
posted @ 2020-07-14 16:33  归鸿唱晚  阅读(102)  评论(0编辑  收藏  举报