我直接看题解。。
题目
分析
我们如何知道 s[j+1…i] 或者 s[0…i]是否为回文串呢?可以使用与「131. 分割回文串」中相同的预处理方法,将字符串 s 的每个子串是否为回文串预先计算出来。
f[i]表示s[0…i]的最小分割次数,枚举 j ,如果[j+1,i]是回文,就可以将[0…i]分割为[0…j]和[j+1,i],这样分割次数为f[j]+1。总分割次数为min(f[i],f[j]+1),要么不从j分,要么从j分。
注意,如果[0,i]是回文,那么就不用分割,f[i]=0。
代码
class Solution {
public int minCut(String s) {
int n=s.length();
boolean[][] g=new boolean[n][n];
for(int i=0;i<n;i++){
Arrays.fill(g[i],true);
}
for(int i=n-1;i>=0;i--){
for(int j=i+1;j<n;j++){
g[i][j]=(s.charAt(i)==s.charAt(j)&&g[i+1][j-1]);
}
}
int[] f=new int[n];
Arrays.fill(f,Integer.MAX_VALUE);
for(int i=0;i<n;i++){
if(g[0][i]){
f[i]=0;
}
for(int j=0;j<i;j++){
if(g[j+1][i]){
f[i]=Math.min(f[i],f[j]+1);
}
}
}
return f[n-1];
}
}