力扣#5 最長迴文子串
阿新 • • 發佈:2020-12-08
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 啦 今天有點累 先溜溜球摸魚了