LeetCode 5. 最長迴文子串()
阿新 • • 發佈:2018-12-18
題目描述
給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。
示例 1:
輸入: “babad” 輸出: “bab” 注意: "aba"也是一個有效答案。 示例 2:
輸入: “cbbd” 輸出: “bb”
思路
看到這題的時候最先想到使用暴力法,找到所有子串然後找最長的迴文子串,但是實施起來很困難,並且效率不高。在這裡使用一種叫中心擴充套件法的演算法來找回文串,這是基於迴文中心的兩側互為映象,因此可以從中心展開,只要找到所有的2n-1箇中心(中心可以為1個字母或者2個字母),然後依次判斷,找到最長的迴文子串。 官方解答:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/
程式碼
class Solution {
public:
string longestPalindrome(string s) {
int max_len=0;
int start=0;
if(s.size()==0) return "";
for(int i=0;i<s.size();i++)
{
int len1=expandFromCenter(s,i,i);
int len2=expandFromCenter(s,i,i+1);
int len=(len1>len2)? len1 : len2;
if(len>max_len)
{
max_len=len;
start=i-(len-1)/2;
}
}
return s.substr(start,max_len);
}
int expandFromCenter(string s,int i,int j)
{
int left=i,right=j;
while (left>=0 && right<s.size() && s.at(left)==s.at(right))
{
left--;
right++;
}
return right-left-1;
}
};