Leetcode Algorithm 005. Longest Palindromic Substring

来源:互联网 发布:递归算法反汇编 编辑:程序博客网 时间:2024/05/27 00:41

Leetcode Algorithm 005. Longest Palindromic Substring

Longest Palindromic Substring
找出字符串中的最长回文子串

解题思路

假设有字符串s,长度为n,用L[i][j]表示从s[i]s[j]的回文字串长度。

枚举子串长度k = 1...n-1,对于每个长度,枚举起始点i以及结束点j = i + k
假如s[i] == s[j],而且L[i + 1][j - 1] > 0(也是回文串) L[i][j] = L[i + 1][j - 1] + 2;

更新L[i][j]的时候要更新最长回文子串的起始点和长度,从而得到最终的答案。

边界情况有:L[i][i] = 1。假如s[i] == s[j] && i + 1 == jL[i][j] = 2。其余位置为0。

代码

#include<iostream>#include<memory.h>using namespace std;class Solution {public:    string longestPalindrome(string s) {        int n = s.size();        int start = 0;        int length = 1;        int L[n][n];        memset(L, 0, sizeof(L));        for (int i = 0; i < n; i++) {            L[i][i] = 1;        }        for (int k = 1; k < n; k++) {            for (int i = 0, j = i + k; j < n; i++, j++) {                if (s[i] == s[j]) {                    if (i + 1 <= j - 1) {                        L[i][j] = L[i + 1][j - 1] > 0 ? L[i + 1][j - 1] + 2 : 0;                    } else if (i + 1 == j) {                        L[i][j] = 2;                    }                    if (L[i][j] > length) {                        length = L[i][j];                        start = i;                    }                }            }        }        return s.substr(start, length);    }};int main() {    string str;    Solution s;    while (cin >> str) {        cout << s.longestPalindrome(str) << endl;    }    return 0;}

测试样例

babadcbbdaaaaabcbaabcda

输出

babbbaaaaabcbaa
0 0