LeetCode 5. Longest Palindromic Substring

LeetCode 5. Longest Palindromic Substring

题目

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.

大意

找出题目所给字符串的最长回文子串。所给字符串最长为1000位。

思路

  1. 解法一:暴力破解。对字符串s中的所有字串进行回文判断,如果长度大于当前最长字符串,则修改最长字符串。时间复杂度太高。首先两重循环则有 O(log n^2)。还需要回文判断,如果所给字符串是1000为的相同字母,时间无法通过。

  2. 解法二:动态规划。如果我们能找到一种方法,将前面算过的从i到j是否是回文保存到一个地方,然后下次再需要判断时我们直接将原来的值拿来用,时间复杂度就会降低很多。下面代码就是这个思路: 用二维数组bool A[i][j] (长度为1000*1000)表示,从下标为i的字母到下标为j的字串,是否是回文。如果A[i][j]是回文的话,那么A[i+1][j-1]也一定是回文。所以倒过来,如果我知道A[i+1][j-1]是回文,那么我只需要判断 if(A[i+1][j-1]==true && s[i]==s[j]) 就可以得到A[i][j] 是否是回文。所以我们只需要从最短的回文开始依次往上算,假设回文字串长度为3,4,5…依次往上,随后算到len最长的字串及为我们要找的最长子回文子串。

代码

class Solution {
public:
    string longestPalindrome(string s) {
        bool A[1000][1000] = {false};
        int length = s.size();
        int maxlen = 0;
        int start = 0;
        if(length <= 1){
            return s;
        }
        for(int i=0;i<length;++i){
            A[i][i] = true;
            if(i<length-1 && s[i] == s[i+1]){
                A[i][i+1] = true;
                start = i;
                maxlen = 2;
            }
        }
        for(int len = 3; len <= length; ++len){
            for(int i=0; i<=length-len; ++i){
                int j = i+len-1;
                if(A[i+1][j-1] && s[i]==s[j]){
                    A[i][j] = true;
                    maxlen = len;
                    start = i;
                }
            }
        }
        return s.substr(start,maxlen);
    }
};

这个思路是参考别人的,确实精妙。附上地址: http://blog.csdn.net/kangroger/article/details/37742639

你可能感兴趣的:(LeetCode,String,substring)