Leetcode 5. 最長迴文子串

題目要求

給定一個字符串 s,找到 s 中最長的迴文子串。你能夠假設 s 的最大長度爲 1000。
(具體要求請看5. 最長迴文子串php

解題思路

參考了各路大神的解題思路,就這種我感受比較容易理解一點,因此就採用了中心擴展算法,等我再好好看看馬拉車算法再和你們分享吧。
首先要了解迴文的特色,它是關於中心對稱的,這樣的對稱分爲兩種狀況,一種的長度爲奇數的字符串,一種是長度爲偶數的字符串,根據這個特色,就能夠分別比較中心兩側對應的字符,經過判斷兩側對應字符是否相同來得出當前判斷的子串是否爲迴文,代碼以下:算法

代碼

class Solution {

    protected $len    = 0;      // 字符串長度
    protected $start  = 0;      // 起始位置
    protected $length = 0;      // 截取長度

    /**
     * @param String $s
     * @return String
     */
    public function longestPalindrome($s) {
        $this->len = strlen($s);

        for ($i = 0; $i < $this->len; $i++) {
            // 若是起始位置 + 截取長度 = 字符串長度,就不須要繼續循環下去,由於能夠肯定當前長度是最長的
            if ($this->start + $this->length >= $this->len) break;

            $this->expandAroundCenter($s, $i, $i);          // 狀況 1: aba
            $this->expandAroundCenter($s, $i, $i + 1);      // 狀況 2: bb
        }

        // 使用 substr 函數,截取相應的字符串
        return substr($s, $this->start, $this->length);
    }

    /**
     * @param String  $str
     * @param Integer $left
     * @param Integer $right
     */
    protected function expandAroundCenter($str, $left, $right) {
        // 這裏判斷左右兩邊對應字符是否相等,若是相等,left-1,right+1,繼續比較
        while ($left >= 0 && $right < $this->len && $str[$left] === $str[$right]) {
            $left--;
            $right++;
        }
        // 當上面循環結束,也就是找到了一個迴文子串
        // temp 是子串的長度
        $temp = $right - $left - 1;

        // 與 length 比較,看當前找到的子串是不是較長的那個,
        // 若是是,就給 start 和 length 賦值
        if ($this->length < $temp) {
            $this->start  = $left + 1;
            $this->length = $temp;
        }
    }
}
相關文章
相關標籤/搜索