给出一个字符串s,问至少需要s分割多少次,才能够让他的每个子字符串都是回文串
定义数组f[],f[i]表示s0-si的字符串需要分割f[i]次使得他的每个子字符串都是回文串
可以得出状态转移方程
f[i] = 0 如果s0-si是回文串
f[i] = Math.min(f[i], f[j] +1) 当s0-sj && sj+1-si是回文串
同理,仍然需要对字符串s进行预处理,令dp[i][j] 表示字符串si-sj是否回文串
public class Solution {
int ans;
public int minCut(String s) {
boolean[][] dp = new boolean[s.length()][s.length()];
for (int k = 0; k < s.length(); ++k) {
for (int i = 0;i + k < s.length(); ++i) {
dp[i][i + k] = s.charAt(i) == s.charAt(i + k) && (k <= 1 || dp[i + 1][i + k - 1]);
}
}
int[] f = new int[s.length()];
for(int i = 0; i < s.length(); ++i){
if(dp[0][i]){
f[i] = 0;
}
else{
f[i] = Integer.MAX_VALUE;
for(int j = 0; j <= i; ++j){
if(dp[j][i]){
f[i] = Math.min(f[i], f[j - 1] + 1);
}
}
}
}
return f[s.length() - 1];
}
}