public class DayCode {
public static void main(String[] args) {
String s = "aab";
int ans = new DayCode().minCut(s);
System.out.println("ans is " + ans);
}
/**
* https://leetcode-cn.com/problems/palindrome-partitioning-ii/
* @param s
* @return
*/
public int minCut(String s) {
if (s == null || s.length() == 1) {
return 0;
}
int len = s.length();
int[] dp = new int[len];
Arrays.fill(dp, len - 1);
for (int i = 0; i < len; i++) {
minCutHelper(s, i, i, dp);
minCutHelper(s, i, i + 1, dp);
}
return dp[len - 1];
}
/**
* @desc 如果以当前字符为中心的最大回文串左侧为i,右侧为j,
那s[i]~s[j]长度是不需要切割的,只需要在s[i-1]处切一刀即可,即dp[i-1]+1。
所以更新dp[j] = min(dp[j] , dp[i-1]+1),不断往外扩散更新dp值取dp[-1]即可。
* @param s
* @param i
* @param j
* @param dp
*/
public void minCutHelper(String s, int i, int j, int[] dp) {
int len = s.length();
while (i >= 0 && j < len && s.charAt(i) == s.charAt(j)) {
dp[j] = Math.min(dp[j], (i == 0 ? - 1 : dp[i -1]) + 1);
i--;
j++;
}
}
}
评论