题目名称:leetcode 5. Longest Palindromic Substring
难度:Medium
知识点:动态规划
解题思路:这道题最简单直观的想法是遍历所有的char,并且以当前char为中心向两边散开,像是打开一个小窗口,不断打开直到左右边际的两个char不再相等或者抵达string边界,即回文不再形成,这个方式是可行的,但是这个方式的问题是,遍历每个char时,都是一个新的中点,前一个遍历点的判断结果不能被reuse。
第二个想法是还是遍历所有的char, 但是不是作为中心,而是作为右边界,窗口是string起点到右边界之间,我们通过不断向右移动左边界来判断当前右边界和和移动的左边界之间形成的窗口是否是回文,在这过程中,通过判断之前存下来的回文状态,我们可以很快的更新现在的最长回文,并记录下来,我们需要一直向右移动左边界,直到到达右边界,因为后面遍历到的的右边界需要前一个右边界的信息,即每一层新的外衣都依赖于内层。
Java代码如下:
class Solution {
public String longestPalindrome(String s) {
//dynamic programming
//if whole string is palindrome then inner string is palindrome
if(s.length() <= 1) return s;
int len = s.length();
boolean[][] dp = new boolean[len][len];
int maxlen = 1;
String maxStr = s.substring(0, 1);
for(int r = 1; r < len; r++){
for(int l = 0; l < r; l++){
if(s.charAt(r) == s.charAt(l) && (r-l<=2 || dp[r-1][l+1] == true)){
dp[r][l] = true;
if(r - l + 1 > maxlen){
maxlen = r - l + 1;
maxStr = s.substring(l, r+1);
}
}
}
}
return maxStr;
}
}
Reference: