1. 程式人生 > 實用技巧 >力扣#5 最長迴文子串

力扣#5 最長迴文子串

 1 class Solution {
 2     public String longestPalindrome(String s) {
 3         if(s.equals("")) return "";
 4         String origin = s;
 5         String reverse = new StringBuffer(s).reverse().toString();
 6         int n = s.length();
 7         int[][] str = new int[n][n];
 8         int maxLen = 0;
9 int maxEnd = 0; 10 for(int i = 0; i < n; i++){ 11 for(int j = 0; j < n; j++){ 12 if(origin.charAt(i) == reverse.charAt(j)){ 13 if(i == 0 || j == 0){ 14 str[i][j] = 1; 15 } 16 else
{ 17 str[i][j] = str[i - 1][j - 1] + 1; 18 } 19 } 20 if(str[i][j] > maxLen){ 21 int beforeRev = n - 1 - j; //判斷倒置前的下標是否相等 例如 s = abc435cba s' = abc534cba 22 if (beforeRev + str[i][j] - 1 == i){ //如果相等 才是我們要找的迴文串
23 maxLen = str[i][j]; 24 maxEnd = i; 25 } 26 } 27 } 28 } 29 return s.substring(maxEnd - maxLen + 1, maxEnd + 1); 30 } 31 }

今天的日常有點難(一看就懂 一做就廢) 大家自行去看看罷 我CV溜了

a b a c d
d 0 0 0 0 1
c 0
a 1
b 0
a 1
a b a c d
d 0 0 0 0 1
c 0 0
a 1 0
b 0 2
a 1 0
a b a c d
d 0 0 0 0 1
c 0 0 0
a 1 0 1
b 0 2 0
a 1 0 3

第五題主要這樣一列一列的將原字元和翻轉之後的字元進行比較 第一列和第一行置為1

動態規劃的轉移公式是 dp[i - 1][j - 1] + 1= dp [ i ][ j ] 第一行和第一列除外

如果dp [ i ][ j ] > maxLen的話 則更新最大長度 並且記錄起始位置maxEnd

最後 substring 啦 今天有點累 先溜溜球摸魚了