力扣#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 啦 今天有点累 先溜溜球摸鱼了

 

 

 

posted @ 2020-12-08 19:10  加利亚的赤色恶魔  阅读(67)  评论(0)    收藏  举报