給定一個字符串 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; } } }