LeetCode-005 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.

Input: “cbbd”
Output: “bb”

Analyse

题目的意思很简单,就是找出最长的回文子串,但要是我们单纯的用最简单的枚举所有起点和终点然后再判断是否为回文串的方法,那么时间复杂度为 O ( n 3 ) O(n^3) O(n3),而s的长度最大为1000,这明显是会超时的。然后我们再略加思考,就会发现,我们可以枚举每个子串的中心,然后再往两边扩散,扩散的字符必须相同,那么我们就能得到回文子串了,再选择最大长度存储即可。这样的时间复杂度为 O ( n 2 ) O(n^2) O(n2),以上的n都为s的长度。

Code

class Solution {
public:
    string longestPalindrome(string s) {
        int start = 0, len = 1;
        for (int i = 0; i < s.size(); i++) {
            int p = i, q = i;
            //长度为奇数的回文子串
            while (p > 0 && q < s.size() - 1 && s[p - 1] == s[q + 1]) {
            	p--;
            	q++;
            }
            if (q - p + 1 > len) {
                start = p;
                len = q - p + 1;
            }
            //长度为偶数的回文子串
            p = i + 1;
            q = i;
            while (p > 0 && q < s.size() - 1 && s[p - 1] == s[q + 1]) {
            	p--;
            	q++;
            }
            if (q - p + 1 > len) {
                start = p;
                len = q - p + 1;
            }
        }
        return s.substr(start, len);
    }
};

你可能感兴趣的:(算法设计)