題目
Given a string S,
find the longest palindromic substring in S.
You may assume that the maximum length of S is
1000, and there exists one unique longest palindromic substring.
思路
題目是要求出字符串中的最長迴文子串。定義計數變量cnt用於存儲迴文子串的長度,存儲迴文子串開始位置的變量start,光標cur,光標左右位置left和right。可以分爲兩種情況:1.連續相同字符如aabb這樣的,遇到相同字符則cnt+1,然後光標移動開始下次循環;2.沒有連續相同字符但是以某個字符對稱如abcba,遇到對稱字符則cnt+2,然後光標移動開始下次循環。最後substring(start,start+cnt)即爲所求迴文子串。
代碼
Python
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
#cur是光標,maximum記錄迴文最大長度,cnt用於臨時存儲迴文子串的長度,start是迴文子串起始位置
cur,maximum = 1,1
cnt,start = 0,0
if (len(s) == 2):
if (s[0]==s[1]):
return s
while (cur < len(s)-1) & ((len(s)-cur-1)*2>maximum):
left = cur - 1
right = cur + 1
cnt = 1
if (s[left] == s[cur]) | (s[right] == s[cur]):
while(left >= 0):
if s[left] == s[cur]:
cnt += 1
left -= 1
else:
break
while(right <= len(s)-1):
if s[right] == s[cur]:
cnt += 1
right += 1
else:
break
cur = right
while (left >= 0) & (right <= len(s)-1):
#處理類似asddddddsa這樣的情況
if s[left] == s[right]:
cnt += 2
left -= 1
right += 1
else:
break
if cnt > maximum:
maximum = cnt
start = left + 1
else:
#處理類似abcdcba這樣以某字符對稱的迴文情況
while (left >= 0) & (right <= len(s)-1):
#處理類似asddddddsa這樣的情況
if s[left] == s[right]:
cnt += 2
left -= 1
right += 1
else:
break
cur += 1
if cnt > maximum:
maximum = cnt
start = left + 1
return s[start:start+maximum]
Java
public class Solution {
public String longestPalindrome(String s) {
char[] str=s.toCharArray();
int max=1;//record max length of palindrome
int cur=1;
int left,right;
int cnt;//record temp max length of palindrome
int start=0;//record longest palindrome beginning location
if(str.length==2&&str[0]==str[1]) return s;
while(cur<str.length-1&&(str.length-cur-1)*2>max){//處理長度大於三的字符串
left=cur-1;
right=cur+1;
cnt=1;
if(str[left]==str[cur]||str[right]==str[cur]){//判斷是否有連續相同的字符
while(left>=0){
if(str[left]==str[cur]){
cnt++;
left--;
}
else break;
}
while(right<=str.length-1){
if(str[right]==str[cur]){
cnt++;
right++;
}
else break;
}
cur=right;//reset cur location
while(left>=0&&right<=str.length-1){// 類似'cbaaaaaabc'的情況
if(str[left]==str[right]){
cnt=cnt+2;
left--;
right++;
}
else break;
}
if(cnt>max){
max=cnt;
start=left+1;// 最長迴文子串的開始位置
}
}
else{// 以光標爲中心對稱的迴文字符串,如sdfgfdl
while(left>=0&&right<=str.length-1){
if(str[left]==str[right]){
cnt=cnt+2;
left--;
right++;
}
else break;
}
cur++;
if(cnt>max){
max=cnt;
start=left+1;
}
}
}
return s.substring(start,start+max);
}
}