题目描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e4cceb993ede5135bd9cf70f12671586.png)
解法一:记忆化递归
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/db5342c17e8080e465a8e741e8e55c0b.png)
class Solution {
private char[] cs;
private int[] temp;
public int minCut(String s) {
this.cs = s.toCharArray();
this.temp = new int[cs.length];
return dfs(0) - 1;
}
private boolean check(int from,int to){
int i = from,j = to;
while(i < j && cs[i] == cs[j]){
++i;
--j;
}
return i >= j;
}
private int dfs(int startIndex){
if(startIndex == cs.length){
return 0;
}
if(temp[startIndex] > 0){
return temp[startIndex];
}
int j = cs.length - 1;
int res = 2001;
while(j >= startIndex){
if(check(startIndex,j)){
res = Math.min(res,1 + dfs(j + 1));
}
--j;
}
temp[startIndex] = res;
return res;
}
}
解法二:动态规划
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3bfac35b46ae44502e168ad5e5250b4d.png)
class Solution {
public int minCut(String s) {
char[] cs = s.toCharArray();
int n = cs.length;
int[] dp = new int[n + 1];
dp[0] = 0;
for (int i = 1; i <= n; i++) {
dp[i] = 2001;
for (int j = 0; j < i; j++) {
if(check(cs,j,i-1)){
dp[i] = Math.min(dp[i],dp[j] + 1);
}
}
}
return dp[n] - 1;
}
private boolean check(char[] cs, int from, int to) {
int i = from, j = to;
while (i < j && cs[i] == cs[j]) {
++i;
--j;
}
return i >= j;
}
}