【leetcode】Palindrome Partitioning II

class Solution {
public:
    int minCut(string s) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
       
        //palLens(i)表示s[i]-s[n]的cutNum
        //palLens(i)=min{ 1+palLens(j+1) if s(i,j) is palindrome, j from i until n }O(n*n*O(isPalindrome))
        
        //isPalindrome检查回文,p(i)(j)=true if (s(i)==s(j) && (i-j<2 || p(i+1)(j-1))[i-j<2表示a,ab,aa这样一到两个的终端情况]
        //for(i){for(j<=i)}保证了处理p[j][i]时,p[j+1][i-1]已经被计算好了,O(isPalindrome)=O(1)
        
        //总时间O(n*n)
        int len=s.size();
        if(len==0) return 0;
        
        vector<int> palLens(len+1);
        for(int i=0;i<=len;i++)//s[0]-s[i]之间的要切几刀
            palLens[i]=i-1;//palLens[1]=0表示s中有一个字符时,切0刀
        
        vector<vector<bool> >p(len,vector<bool>(len,false));//p[i][j]为true表示s[i]到s[j]之间为回文串    
            
        for(int i=1;i<=len-1;i++)//i从1开始,保证循环体中p[][i-1]中从p[][0]开始;另外p[][0]均为false,从p[][1]到p[][len]才是合理的判断
            for(int j=0;j<=i;j++)//j<=i保证了处理p[j][i]时,p[j+1][i-1]已经被计算好了
            {
                if( (s[i]==s[j])&&(i-j<2 || p[j+1][i-1]) )
                {
                    p[j][i]=true;
                    palLens[i+1]=min(palLens[i+1],1+palLens[j]);//从palLens[1]开始计算,因为palLens[0]这个特殊情况的处理已经return了
                }
            }
            
        return  palLens[len];
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值