0
点赞
收藏
分享

微信扫一扫

剑指 Offer II 094. 最少回文分割 (dp)

追风骚年 2022-05-02 阅读 36

题目链接
在这里插入图片描述

class Solution {
public:
    int minCut(string s) {
        //先预处理出s的每个子串是否为回文字符串
        int n=s.size();
        vector<vector<bool> > f(n,vector<bool>(n,true));
        for(int i=n-1;i>=0;i--){
            for(int j=i+1;j<n;j++){
                f[i][j] = f[i+1][j-1] && s[i]==s[j]; 
            }
        }
        int dp[n];//dp[i]表示子串s[0...i]切割为回文的最小切割次数,它可由s[0...j]+1转移过来,其中s[j+1....i]是回文字符串
        memset(dp,0x3f,sizeof(dp));
        //如果s[0...i]本身就是回文字符串,则次数为0
        for(int i=0;i<n;i++){
            if(f[0][i]){
                dp[i]=0;//本身就是回文字符串必须特判
            }else{
                for(int j=0;j<i;j++){
                    if(f[j+1][i]){
                        dp[i]=min(dp[i],dp[j]+1);
                    }
                }
            }
        }
        return dp[n-1];


    }
};
举报

相关推荐

0 条评论