【leetcode132】分割回文串

https://leetcode-cn.com/problems/palindrome-partitioning-ii/submissions/

分析

考虑dp[i]表示从开头到下标i为止的字符串的最小分割次数,字符串初始下标为1,转移方程为dp[i]=min(dp[j-1])+1,其中1<=j<=i,且满足s从j到i(闭区间)为回文串。dp[0]设置为-1。dfs判断回文串。

class Solution {
public:
    int f[2010][2010]={0},dp[2010]={-1};
    char s[2010]={0};
    int dfs(int l,int r)
    {
        if(f[l][r]!=-1)return f[l][r];
        if(l==r){f[l][r]=1;return 1;}
        if(l==r-1)
        {
            if(s[l]==s[r]){f[l][r]=1;return 1;}
            else {f[l][r]=0;return 0;}
        }
        if(s[l]==s[r])
        {
            f[l][r]=dfs(l+1,r-1);
            return f[l][r];
        }
        f[l][r]=0;
        return 0;
    }
    int minCut(string s1) {
        int ls=s1.length();
        for(int i=0;i<ls;i++)
        {
            s[i+1]=s1[i];
        }
        for(int i=1;i<=ls;i++)
        {
            for(int j=1;j<=ls;j++)
            {
                f[i][j]=-1;
            }
        }
        for(int i=1;i<=ls;i++)
        {
            for(int j=i;j<=ls;j++)
            {
                dfs(i,j);
            }
        }
        for(int i=2;i<=ls;i++)
        {
            int minn=2001;
            for(int j=1;j<=i;j++)
            {
                if(f[j][i]&&minn>dp[j-1])minn=dp[j-1];
            }
            dp[i]=minn+1;
        }
        return dp[ls];
    }
};
posted @ 2021-09-20 18:01  Tsyxxxka  阅读(27)  评论(0)    收藏  举报
levels of contents