leetcode132-分割回文串 II
- 双重dp
首先需要用dp去记录s中回文子串的信息,找出所有的回文子串,方法如上一题。
然后对子串进行拆分,拆分的时候需要用到dp。
对于下标为i这一点,需要去遍历[0, i]这些部分,找出所有以i点结束的回文子串,计算相应的拆分数量,取较小值。
由于最后返回的是分割数量而不是拆分后字符串的数量,所以返回结果为f[n]-1
class Solution {
public int minCut(String s) {
int n = s.length(), f[] = new int[n+1];
boolean dp[][] = new boolean[n][n];
for(int i = n-1; i >= 0; i--){
for(int j = i; j < n; j++){
if(i > j-2) dp[i][j] = s.charAt(i) == s.charAt(j);
else dp[i][j] = dp[i+1][j-1] && s.charAt(i) == s.charAt(j);
}
}
Arrays.fill(f, Integer.MAX_VALUE);
f[0] = 0;
for(int i = 0; i < n; i++){
for(int j = i; j >= 0; j--){
if(dp[j][i]) f[i+1] = Math.min(f[i+1], f[j]+1);
}
}
return f[n]-1;
}
}

浙公网安备 33010602011771号