leetcode132-分割回文串 II

分割回文串 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;
    }
}
posted @ 2022-08-17 13:37  xzh-yyds  阅读(28)  评论(0)    收藏  举报