目录
- [1- 思路](#1- 思路)
- [2- 实现](#2- 实现)
-
- [⭐++5. 最长回文子串++------题解思路](#⭐5. 最长回文子串——题解思路)
- [3- ACM 实现](#3- ACM 实现)
- 原题链接:5. 最长回文子串
1- 思路
题目识别
- 识别1 :给一个
String
返回最长回文子串
动规五部曲
- 1- 定义 dp 数组
dp[i][j]
代表 区间[i,j]
是否为回文子串,如果是则为true
- 2- 递推公式
- 只有在
s[i] == s[j]
的情况下,才需要进行递推。分三种情况- ①
i == j
:若是同一个元素,则dp[i][j]
肯定为 true - ②
i
和j
相差1
:若是两个相邻元素,则dp[i][j]
也一定为 true - ③
j - i > 1
:若是相差两个以上的元素,需要判断dp[i+1][j-1]
是否为 true
- ①
- 只有在
- 3- 初始化
- 默认所有 都是为
false
- 默认所有 都是为
- 4- 遍历顺序
dp[i][j]
由dp[i+1][j-1]
推导而来,也就是由左下角推导而来,因此i
需要从s.size()
来遍历
2- 实现
⭐++5. 最长回文子串++------题解思路
java
class Solution {
public String longestPalindrome(String s) {
// 1. 利用回文子串求解
// 定义 dp
int len = s.length();
boolean[][] dp = new boolean[len][len];
// 2. 递推公式
// 只有相等的时候 需要进行递推
// 3. 初始化
// 默认都是 false
String res = "";
// 4.遍历顺序
for(int i = len-1;i>=0;i--){
for(int j = i ; j < len;j++){
if(s.charAt(i) == s.charAt(j)){
if( j - i <= 1 ){
dp[i][j] = true;
}else if(dp[i+1][j-1]){
dp[i][j] = true;
}
if(dp[i][j] && res.length() < j-i+1){
res = s.substring(i,j+1);
}
}
}
}
return res;
}
}
3- ACM 实现
java
public class longestPlainDrome {
public static String longestP(String s){
String res = "";
// 1.定义 dp 数组
int len = s.length();
boolean[][] dp = new boolean[len][len];
// 2.递推公式
// 相等: <=1 则为 true ,否则得看 dp[i+1][j-1] 为 true 才为 true
// 3. 初始化
for(int i = len-1 ; i >= 0;i--){
for(int j = i ; j < len;j++){
if(s.charAt(i) == s.charAt(j)){
if( j - i <= 1){
dp[i][j] = true;
}else if(dp[i+1][j-1]){
dp[i][j] = true;
}
if(dp[i][j] && j-i+1 > res.length()){
res = s.substring(i,j+1);
}
}
}
}
return res;
}
public static void main(String[] args) {
System.out.println("输入字符串");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
System.out.println("结果是"+longestP(input));
}
}