题解 | #最长回文子串#

最长回文子串

http://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af

中心扩散法:

class Solution {
public:
    int getLongestPalindrome(string A, int n) {
        if(n < 2) return n;
        int left, right, maxlen = 1;
        for(int i = 0; i < n; i++) { //以每个字符为中心左右扩散
            //长度为奇数时
            left = i;
            right = i;
            while(left >= 0 && right < n) { //确保不越界
                if(A[left] == A[right]) { //判断左右字符是否相等
                    maxlen = max(maxlen, right - left + 1); //相等时更新最大长度
                    left--;
                    right++; //左右各扩散一位
                }
                else break; //若不相等则退出循环
            }
            //长度为偶数时
            left = i;
            right = i + 1; 
            while(left >= 0 && right < n) { //原理同上
                if(A[left] == A[right]) {
                    maxlen = max(maxlen, right - left + 1);
                    left--;
                    right++;
                }
                else break;
            }
        }
        return maxlen; //返回最大值
    }
};

动态规划:

class Solution {
public:
    int getLongestPalindrome(string A, int n) {
        // write code here
        if(n < 2) return n;
        int maxlen = 1;
        vector<vector<int>> dp(n, vector<int>(n, 0));
        for (int i = 0; i < n; ++i) {
            dp[i][i] = 1; //长度1一定为回文
        }
        for(int i = 2; i <= n; i++) { //从短到长对每种长度分别判断,可以这么做是因为判断较长的需要利用较短的
            for(int j = 0; j < n - i + 1; j++) { //从头开始对长度i+1的子字符串判断
                if(i == 2) {
                    dp[j][j + 1] = (A[j] == A[j + 1]); //长度2判断头尾是否相等
                }
                else {
                    if(A[j] == A[j + i - 1]) 
                        dp[j][j + i - 1] = dp[j + 1][j + i - 2]; //长度大于等于3,判断两头是否相等,若相等则同去两头的bool值一样
                    else 
                        dp[j][j + i - 1] = 0; //否则为0
                }
                if(dp[j][j + i - 1]) maxlen = max(maxlen, i); //更新最大值
            }
        }
        return maxlen;
    }
};
全部评论

相关推荐

刘湘_passion:出国旅游?那就小心你的腰子咯
点赞 评论 收藏
分享
ALEX_BLX:虽然说聊天记录不可信,不过这个趋势确实如此但我觉得也要想到一点就是卷后端的人里真正有“料”的人又有多少,我说的这个料都不是说一定要到大佬那种级别,而是就一个正常的水平。即使是现在也有很多人是跟风转码的,2-3个月速成后端技术栈的人数不胜数,但今时不同往日没可能靠速成进大厂了。这种情况就跟考研一样,你能上考场就已经打败一半的人了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务