// 1. dp[i][i] 为true 2. 如果s.charAt(left)==s.charAt(right) 并且(left到right的长度为2 或者 dp[left+1][right-1]为true)
class Solution {
public static String longestPalindrome(String s) {
// 1. length >=1 所以不需要特殊处理
// 2. 设置dp数组
int length = s.length();
boolean[][] dp = new boolean[length][length];
// 3. 在递推的过程中,要知道最大的回文串
int start = 0;
int maxLen = 1;
// 4. 开始递推,这里要从right开始
for (int right = 0; right < length; right++) {
// 5. 字符串本身是true
dp[right][right] = true;
// 6. 这里就是核心的递推逻辑,如果s.charAt(left)==s.charAt(right) 并且(left到right的长度为2 或者
// dp[left+1][right-1]为true)
for (int left = 0; left < right; left++) {
if (s.charAt(left) == s.charAt(right) && ((right - left <= 2) || dp[left + 1][right - 1])) {
dp[left][right] = true;
if (right - left + 1 > maxLen) {
start = left;
maxLen = right - left + 1;
}
}
}
}
return s.substring(start, start + maxLen);
}
}
Hot100【四】:5. 最长回文子串
于 2024-04-08 22:11:03 首次发布