不知不覺就刷完了五十道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); } }