leetcode 5最長迴文子串 (leetcode一週目結束)

不知不覺就刷完了五十道leetcode算法題,這麼算起來整個大一也差很少刷了120題左右的樣子。雖然大一上很遺憾沒有繼續堅持打ACM,可是一樣也有了不少學習其餘除了算法外的知識的時間,不過刷題確實能夠改變代碼習慣和提升編程水平,這也是我堅持學習算法的緣由。這一週目的刷題就到此爲止了,個人大一的算法+開發並行的學習方式讓個人代碼水平有了很大的提升。大二開始我應該就開始專一學習Java開發了。啊,大一過的好充實啊!(而後就開始瘋狂預習期末考555)。
在這裏插入圖片描述java

給定一個字符串 s,找到 s 中最長的迴文子串。你能夠假設 s 的最大長度爲 1000。

示例 1:

輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。
示例 2:

輸入: "cbbd"
輸出: "bb"

題解

這題我是用的中心拓展法,其實一開始我根本不知道這個方法叫中心拓展法,寫出來後看了題解才知道這個竟然有名字。思路就是字符串的每一位其實都是一個迴文子串的中心,只要從中心向外拓展就能夠達到檢查迴文子串的目的。在這個過程當中須要維護兩個指向迴文子串頭和尾的指針,代碼以下web

class Solution {
    public String longestPalindrome(String s) {
        int maxNum = 1, temp = 1, i,j;
        // s爲空狀況
        if (s.length() == 0) {
            return "";
        }
        // 設置初始值
        String ansString = s.substring(0,1);
        for (i=0; i<s.length(); i++) {
            // 按奇數長度拓展
            for (j=0; (i-j) > 0 && (i+j+1) < s.length(); j++) {
                if(s.charAt(i-j-1) != s.charAt(i+j+1)) {
                    break;
                }    
                // 記錄此循環迴文長度
                temp = (j+1)*2+1;
            }
            if (temp > maxNum) {
                maxNum = temp;
                ansString = s.substring(i-j, i-j+maxNum);
            }
            // 按偶數長度拓展
            for (j = 0; (i-j) >= 0 && (i+j+1) < s.length(); j++) {
                if(s.charAt(i-j) != s.charAt(i+j+1)) {
                    break;
                }           
                temp = j*2+2;                
            }
            if (temp > maxNum) {
                // 推導得j須要減一
                j-=1;
                maxNum = temp;
                ansString = s.substring(i-j, i-j+maxNum);  
            }
        }
        return ansString.toString();
    }
    public static void main(String[] args) {
        Solution s = new Solution();
        String ansString = s.longestPalindrome("cccc");
        System.out.println(ansString);
    }
}
相關文章
相關標籤/搜索