1. 程式人生 > >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.

Example 1:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Example 2:

Input: "cbbd"
Output: "bb"

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s

 的最大長度為 1000。

示例 1:

輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。

示例 2:

輸入: "cbbd"
輸出: "bb"

解析:這道題讓我們求最長迴文子串,首先說下什麼是迴文串,就是正讀反讀都一樣的字串,比如 "bob", "level", "noon" 等等。那麼最長迴文子串就是在一個字串中的那個最長的迴文子串。LeetCode中關於迴文串的題共有五道,除了這道,其他的四道為 Palindrome Number Validate Palindrome Palindrome Partitioning

Palindrome Partitioning II,我們知道傳統的驗證迴文串的方法就是兩個兩個的對稱驗證是否相等,那麼對於找回文字串的問題,就要以每一個字元為中心,像兩邊擴散來尋找回文串,這個演算法的時間複雜度是O(n*n),可以通過OJ,就是要注意奇偶情況,由於迴文串的長度可奇可偶,比如"bob"是奇數形式的迴文,"noon"就是偶數形式的迴文,兩種形式的迴文都要搜尋,對於奇數形式的,我們就從遍歷到的位置為中心,向兩邊進行擴散,對於偶數情況,我們就把當前位置和下一個位置當作偶數行迴文的最中間兩個字元,然後向兩邊進行搜尋,參見程式碼如下:

class Solution {
public:
    string longestPalindrome(string s) {
        if(s.size()<2) return s;
        int start =0, maxlen=0;
        for(int i=0;i<s.length()-1;++i)
        {
            sub(s,i,i,start,maxlen);
            sub(s,i,i+1,start,maxlen);
        }return s.substr(start,maxlen);
    }
    void sub(string s,int left,int right,int &start,int &maxlen)
    {
        while(left>=0&&right<s.size() && s[left]==s[right])
        {
            right++; left--;
        }
        if(maxlen < right-left-1)
        {
            maxlen = right-left-1;
            start = left+1;
        }
    }
};