leetcode第5題——**Longest Palindromic Substring

題目

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);
}
}
發佈了39 篇原創文章 · 獲贊 17 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章