https://leetcode.com/problems/palindrome-partitioning-ii/
一个字符串最小经过几次切分,所得子串都是回文
dp[i]表示从位置i到末尾需要的最少切分次数。倒序遍历字符串,遍历到当前位置i,以当前位置为中心a、b指针分别左右移,始终保证[a, b]之间为回文dp[a] = min(dp[a], dp[b + 1] + 1)。这里面注意先初始化所有位置为len + 1(比所有可能值大即可,dp中有效值不会超过len),同时dp[len]为-1
public class Solution {
public int minCut(String s) {
if (s == null || s.length() == 0) {
return 0;
}
int len = s.length();
int[] dp = new int[len + 1];
Arrays.fill(dp, len + 1);
dp[len] = -1;
for (int i = len - 1; i >= 0; i--) {
for (int a = i, b = i; a >= 0 && b < len && s.charAt(a) == s.charAt(b); a--, b++) {
dp[a] = Math.min(dp[a], dp[b + 1] + 1);
}
for (int a = i, b = i + 1; a >= 0 && b < len && s.charAt(a) == s.charAt(b); a--, b++) {
dp[a] = Math.min(dp[a], dp[b + 1] + 1);
}
}
return dp[0];
}
}