给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。
返回符合要求的 最少分割次数 。
例:
输入:s = “aab”
输出:1
解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。
题解:动态规划
先利用动态规划对字符串进行预处理,找出回文串中所有的回文子串。然后继续利用动态规划方法,用int [ ]min 记录字符串前i个字符的最少分割次数(i=0,1,2,3…min.length-1)。
动态规划方程:
min[ i ]=Math.min(min[ i ],min[ j ]+1) (注:s.subString(j+1,i)为回文子串,且 j 取遍0到i-1)
class Solution {
int min=Integer.MAX_VALUE;
boolean[][]dp;
public int minCut(String s) {
int l=s.length();
dp=new boolean[l][l];
for(int i=0;i<l;i++){
dp[i][i]=true;
}
for(int i=1;i<l;i++){
for(int j=0;i+j<l;j++){
if(s.charAt(j)==s.charAt(i+j)&&(j+1>j+i-1||dp[j+1][j+i-1])){
dp[j][j+i]=true;
}
}
}
int[]cutDP=new int[l];
Arrays.fill(cutDP,Integer.MAX_VALUE);
for(int i=0;i<l;i++){
if(dp[0][i]){
cutDP[i]=0;
continue;
}
for(int j=0;j<i;j++){
if(dp[j+1][i]){
cutDP[i]=Math.min(cutDP[j]+1,cutDP[i]);
}
}
}
return cutDP[l-1];
}
}