5. Longest Palindromic Substring

来源:互联网 发布:示范性软件学院排名 编辑:程序博客网 时间:2024/06/06 12:59

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

思路:暴力穷举的话,判断任意两个index之间的subString是不是回文,有C(n,2)种substring, 对于每个substring判断是不是回文,需要O(n)的时间复杂度,所以一共是O(n^3)的时间复杂度。

一种简单的解法是:可以避免一些重复计算,比如已经知道s[i+1][j-1]是回文串了,如果s[i]==s[j],则可以知道s[i][j]也是回文串。可以用DP来解,分下面三种情况来逐步计算:
1) 自己和自己肯定是回文,所以最小的回文串长度是1;
2) 对于回文串是偶数的情况,判断相邻的两个是否是回文,如果存在的话,回文串最小长度是2;
3)对于回文串如果长度>2的情况,就可以用判断ij中间的子串是否为回文以及s[i][j]是否相等来判断。

DP就是创建一些初始已知的状态,后面的状态可以根据前面的状态进行判断。

http://articles.leetcode.com/longest-palindromic-substring-part-i
DP的话是O(n^2)的时间复杂度和O(n^2)的空间复杂度,还有O(1)空间复杂度的解法, 以后有时间在看吧。

class Solution {public:    string longestPalindrome(string s) {        int n = s.size();        int start = 0;        bool status[1000][1000] = {false};        int maxLen = 1; //at least is 1        // len = 1        for(int i = 0; i < n; i++)        {            status[i][i] = true;        }        // len = 2        for(int i = 0; i < n -1; i++)        {            if(s[i] == s[i+1])            {                status[i][i+1] = true;                maxLen = 2;                start = i;            }        }        // len>=3        for(int len = 3; len <= n; len++)        {            for(int i = 0; i < n - len + 1; i++)            {                int j = i + len -1;                if(s[i] == s[j] && status[i+1][j-1])                {                    status[i][j] = true;                    maxLen = len;                    start = i;                }            }        }        return s.substr(start, maxLen);    }};
0 0