提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目描述
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。
返回符合要求的 最少分割次数 。
示例 1:
输入:s = “aab”
输出:1
解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。
示例 2:
输入:s = “a”
输出:0
示例 3:
输入:s = “ab”
输出:1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-partitioning-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题过程
解题思路
动态规划:第一把动态规划–>dp[i][j]表示从索引i到索引j的子串是否为回文串,是则为true,否则为false;第二把动态规划–>split[j]表示前j个字符串最少分割回文串的次数。
答案参考leetcode官方题解,第二把不是很理解。
class Solution {
int min = Integer.MAX_VALUE;
public int minCut(String s) {
boolean dp [][] = new boolean[s.length()][s.length()];
for (int j = 0; j < s.length(); j++) {
for (int i = j; i >=0; i--) {
if (i == j){
dp[i][j] = true;
}else {
if (j - i + 1 == 2 && s.charAt(i) == s.charAt(j)){
dp[i][j] = true;
}else {
if (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]){
dp[i][j] = true;
}else {
dp[i][j] = false;
}
}
}
}
}
int split [] = new int[s.length()];//定义最少分割次数动态规划数组
Arrays.fill(split,Integer.MAX_VALUE);
for (int j = 0; j < s.length(); j++) {
//0--i的字符串是回文串,则split[i]=0,即一次都不需要分割
if (dp[0][j]){
split[j] = 0;
}else{
// split[j] = split[j - 1] + 1;
for (int i = 0; i < j; i++) {
if (dp[i + 1][j]){
split[j] = Math.min(split[j], split[i ] + 1);
}
}
}
}
return split[s.length() - 1];
}
}