其他分享
首页 > 其他分享> > 分割回文串II

分割回文串II

作者:互联网

 

 

详细思路

具有某种递推关系   精确定义 fi 0到i最少分割次数,只需要往前面找fj,j到i是回文串,则fi=fj+1,f0是第一个字符 i下标,最后一个 j下标,最后一个,j+1到i是否为回文   转移 - - - - a b a f i =f j+1  如果s[j+1,i]回文串   初始化 f 0=0本身是回文串分割次数0   判断s[j+1,i]是否为回文串用动态规划g 精确定义 g i j i第一j最后是否回文,ij是下标   转移 - - a b a  g ij =g i+1 j-1      相同   初始化 g i i=g i i-1 =1    遍历方法 for len for i起点
class Solution {
public:
    int minCut(string s) {
        int n=s.size();
        vector<vector<int>>g(n,vector<int>(n,0));
        g[0][0]=1;
        for(int i=1;i<n;i++)g[i][i]=g[i][i-1]=1;
        for(int len=2;len<=n;len++){
            for(int i=0;i+len-1<n;i++){
                int j=i+len-1;
                if(s[i]==s[j])g[i][j]=g[i+1][j-1];
            }
        }
        vector<int>f(n,0x3f3f3f3f);
        f[0]=0;
        for(int i=1;i<n;i++){
            if(g[0][i])f[i]=0;
            else {
                for(int j=0;j<i;j++){
                    if(g[j+1][i])f[i]=min(f[i],f[j]+1);
                }
            }

        }
        return f[n-1];
    }
};
踩过的坑             if(g[0][i])f[i]=0; 是回文串,则不应该去找fj切割        if(g[j+1][i])f[i]=min(f[i],f[j]+1); 应该找一个切割次数最小的fj

标签:分割,下标,int,II,vector,fi,fj,回文
来源: https://www.cnblogs.com/zhouzihong/p/15094183.html