一、题目描述
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。
返回符合要求的 最少分割次数 。
示例 1:
输入:s = “aab”
输出:1
解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。
示例 2:
输入:s = “a”
输出:0
示例 3:
输入:s = “ab”
输出:1
二、题目难度:困难
三、题解
方法一:动态规划
时间复杂度:O(n^2)
空间复杂度:O(n^2)
class Solution {
public int minCut(String s) {
int n = s.length();
int[][] dp = new int[n][n];
for(int i=0;i<n;i++)
Arrays.fill(dp[i],1);
for(int i=n-1;i>=0;i--)
for(int j = i + 1;j<n;j++)
dp[i][j] = (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]==1)?1:0;
int[] f = new int[n];
Arrays.fill(f,Integer.MAX_VALUE);
for(int i=0;i<n;i++){
if(dp[0][i]==1)
f[i] = 0;
else{
for(int j=0;j<i;j++){
if(dp[j+1][i]==1)
f[i] = Math.min(f[i],f[j]+1);
}
}
}
return f[n-1];
}
}