一、题目
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
示例1
输入
"abc1234321ab",12
返回值
7
class Solution {
public:
int getLongestPalindrome(string A, int n) {
// write code here
if(n == 0) return 0;
int res = 1;//记录最长回文子串的长度
int ll=0,rr=0;//记录最后遍历到的最长回文子串的第一个字符和最后一个字符的位置
//遍历字符串A,每个字符对应定义两个指针l和r,比较l和r对应的字符是否相等。l和r的更新考虑两种情况
for(int i=0;i<n;i++){
int l=i-1;
int r=i+1;
while(l>=0 && r<n && A[l]==A[r]){
int len = (r-l+1);
if(res < len){
res = len;
ll = l;
rr = r;
}
l--,r++;//原则1:l和r分别向两边扩张
}
//当l和r不满足while中的临界条件是,根据以下原则2更新l和r的位置
l = i;
r = i + 1;
while(l>=0 && r<n && A[l]==A[r]){
int len = (r-l+1);
if(res < len){
res = len;
ll = l;
rr = r;
}
l--;
r++;
}
}
//return A.substr(ll,rr-ll+1).size();//以babad为例,最后返回的是aba,不是bab
return res;
}
};
python实现:
# -*- coding:utf-8 -*-
class Solution:
def isPalindrome(self, subA):
left = 0
right = len(subA)-1
while left < right:
if subA[left] != subA[right]:
return False
else:
left += 1
right -= 1
return True
def getLongestPalindrome(self, A, n):
# write code here
if n <=1:
return n
else:
longestSub = A[0] # 如果初始化为'',对“abcab”这种的字符串返回0
for i in range(n):
for j in range(i+1, n):
if self.isPalindrome(A[i:j+1]) and (len(A[i:j+1]) > len(longestSub)):
longestSub = A[i:j+1]
return len(longestSub)