[LeetCode] 5. Longest Palindromic Substring

Description:

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example:

Input: "babad"

Output: "bab"

Note: "aba" is also a valid answer.

 

Example:

Input: "cbbd"

Output: "bb"


Solution:

class Solution {
public:
    string longestPalindrome(string s) {  
        int n = s.size();
        // dp[i][j] == true 表示从从索引i到索引j的子串可构成回文
        bool dp[n][n];  
        fill_n(&dp[0][0], n*n, false);  
        int max_len = 1; 
        int start = 0;  
        for(int i = 0; i < s.size(); ++i) {  
            for(int j = 0; j <= i; ++j) {  
                if(i-j < 2)
                    // 子串仅包含一个字母即(j==i)时可构成回文,仅包含两个字母时若两个字母相同,可构成回文,反之不能
                    dp[j][i] = (s[i]==s[j]);  
                else
                    // 子串包含超过三个字母,要使从下标 j 到 i 能构成回文,需要同时满足两个条件
                    // 1. s[i] == s[j] 即子串两端是同一个字母
                    // 2. dp[j+1][i-1] 即子串的中间(两边收缩)也能构成回文,此处体现动态规划思想
                    dp[j][i] = (s[i] == s[j] && dp[j+1][i-1]);  
                if(dp[j][i] && max_len < (i-j+1)) {  
                    max_len = i-j+1;  
                    start = j;  
                }  
            }  
        }  
        return s.substr(start, max_len);  
    }
};


解法参考自:https://blog.csdn.net/shineboyxxb/article/details/52079360

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值