[LeetCode]132. 分割回文串 II(java实现)动态规划 dp
1. 题目
2. 读题(需要重点注意的东西)
思路(dp):
预处理一个数组g[j][i]
,表示从 j 到 i 是否是回文串
由于 f[i] 表达是最少分割的部分,答案要问的是分多少次,因此答案等于 f[i] - 1
3. 解法
---------------------------------------------------解法---------------------------------------------------:
class Solution {
public int minCut(String s) {
int n = s.length();
int[] f = new int[n+1];
s = " " + s;
boolean[][] g = new boolean[n + 1][n + 1];
// 预处理g数组,注意枚举顺序
// g[j][i] = true表示从j到i的字符串为回文字符串
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= i;j ++)
{
if(i == j) g[j][i] = true;
// i - 1 < j + 1 的情况 如 "aa"
else if(s.charAt(i) == s.charAt(j) && (i - 1 < j + 1 || g[j + 1][i - 1]))
g[j][i] = true;
}
// f初始化为正无穷
Arrays.fill(f,0x3f3f3f3f);
// 初始化f[0]
f[0] = 0;
// dp
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= i;j ++)
// 此处f[i]保存的是上一个划分点的结果
if(g[j][i]) f[i] = Math.min(f[i], f[j - 1] + 1);
return f[n] - 1;
}
}
可能存在的问题:
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- dp