Palindrome Partitioning II

来源:互联网 发布:金山画王软件下载 编辑:程序博客网 时间:2024/05/16 13:56
class Solution {public:    int minCut(string s)    {        int *cache=new int[s.size()*s.size()];//判定是否为回文串        int *minCutNum=new int[s.size()];//minCutNum[i]表示s[i:]的minCut        minCutNum[s.size()-1]=0;        memset(cache,-1,s.size()*s.size()*sizeof(int));        for(int i=0;i<s.size();i++)        {            cache[i*s.size()+i]=1;        }        for(int j=s.size()-2;j>=0;j--)        {            if(isPalin(s,j,s.size()-1,cache))            {                minCutNum[j]=0;            }else            {                minCutNum[j]=INT_MAX;                for(int end=j;end<s.size()-1;end++)                {                    if(j==0 && end==3)                    {                        //cout<<"jj"<<endl;                    }                    if(isPalin(s,j,end,cache))                    {                        //end表示划分点                        minCutNum[j]=min(minCutNum[end+1]+1,minCutNum[j]);                    }                }            }        }        //for(int i=0;i<s.size();i++)       // {           // cout<<minCutNum[i]<<endl;        //}        return minCutNum[0];    }        bool isPalin(const string &s,const int i,                 const int j,int *cache)    {        if(i>j) return true;        if(cache[i*s.size()+j]==-1)        {            bool result=(s[i]==s[j] && isPalin(s,i+1,j-1,cache));            if(result)                cache[i*s.size()+j]=1;            else                cache[i*s.size()+j]=0;            return result;        }else        {            return cache[i*s.size()+j]?true:false;        }    }};

0 0