leetcode 题目链接 :
https://leetcode-cn.com/problems/longest-palindromic-substring/
相关题目: 回文子串
题目描述:
解法:动态规划
动态规划 做题 三个步骤:
- 确定dp数组 以及下标含义
- 根据数组下标含义推出状态转移方程
- 确定遍历顺序
此题按这三个步骤的分析如下:
- dp[i][j] 表示区间[i, j] (闭区间) 是否回文串(true表示是)
- 主要分析 s[i] 和 s[j]
1. s[i] != s[j]
dp[i][j] = false;
2. s[i] == s[j]
此时分析情况如下:
* i == j, 此时只有一个元素,那么肯定是回文串。
* j - i == 2 ,此时中间夹着一个字符,比如 aba,那么此时也是一个回文串。
* j - i > 2 时,dp[i][j] 此时要想是回文串,那么dp[i + 1][j - 1] 一定是 true,也就是说在 [i + 1, j - 1] 这个 区间是一个回文串。
3. 确定遍历顺序。根据 递推公式,可以知道。dp[i][j] 的值需要由dp[i + 1][j - 1]判断 。
代码:
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
int maxLen = 1; // 表示最长回文子串
String rest = ""; //函数返回值
boolean[][] dp = new boolean[len][len]; // 动态规划数组
for(int i = len - 1; i >= 0; i--){
for(int j = i; j < len; j++){
if(s.charAt(i) != s.charAt(j)) dp[i][j] = false;
else {
if(j == i || j - i < 3) {
dp[i][j] = true;
}
if(j - i > 2) {
if(dp[i + 1][j - 1]){
dp[i][j] = true;
}
}
}
if(dp[i][j] && j - i + 1 >= maxLen){
maxLen = j - i + 1;
rest = s.substring(i, j + 1);
}
}
}
return rest;
}
}