删除回文子数组
难度:
标签:
题目描述
代码结果
运行时间: 264 ms, 内存: 16.8 MB
/*
* LeetCode 1246: 删除回文子数组
* 题目思路:
* 1. 如果数组本身是回文的,则返回1,因为整个数组可以作为一个回文子数组删除。
* 2. 如果数组不是回文的,则需要两步删除:先删除一个回文子数组,然后删除剩下的。
* 3. 如果我们选择删除数组的第一个和最后一个元素,则剩下的子数组是子问题。
*/
import java.util.stream.IntStream;
public class Solution {
public int minDeletionsToMakePalindrome(int[] arr) {
if (isPalindrome(arr)) {
return 1;
}
return 2;
}
private boolean isPalindrome(int[] arr) {
return IntStream.range(0, arr.length / 2)
.allMatch(i -> arr[i] == arr[arr.length - 1 - i]);
}
}
解释
方法:
该题解使用动态规划的方法来解决删除回文子数组的问题。使用一个二维数组 f[i][j] 表示将数组 arr[i] 到 arr[j] 变为回文子数组所需的最小操作次数。初始化时,f[i][i] 设为 1 因为单个元素自身就是回文。数组 g 用来存储从每个位置 i 开始,与 arr[i] 相同元素的位置,以优化搜索过程。对于每对 i 和 j,如果 arr[i] 等于 arr[j],则 f[i][j] 可直接设为 f[i+1][j-1]。否则,通过遍历 g[i] 中存储的位置,将问题分解为更小的子问题,即将原问题 f[i][j] 分解为 f[i][k] + f[k+1][j] 的形式来计算,其中 k 是 g[i] 中的元素,但需小于 j。
时间复杂度:
O(n^3)
空间复杂度:
O(n^2)
代码细节讲解
🦆
在动态规划数组`f[i][j]`的初始化中,为什么所有元素初始值设为`n`而不是其他数值?
▷🦆
数组`g[i]`存储的是与`arr[i]`相同元素的位置,这种存储方式如何优化搜索过程,具体节省了哪些不必要的计算?
▷🦆
在处理`arr[i]`与`arr[j]`不相等的情况时,为何需要通过遍历`g[i]`来查找所有可能的分割方法而不能直接进行简单分割?
▷