// 状态:F(i)前i个字符的最小切割数
// 转移方程:如果当前整体是回文串:F(i)=0
//          整体不是:F(i)=min(F(j)+1)
//                  前提:j<i并且[j+1,i]是回文串
// 初始值:F(i)=i-1(最大分割数:字符个数-1)
// 返回结果:F(s.size())
#include <string>
class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return int整型
     */
    //判断回文
    bool ispal(string& s,int left,int right)
    {
        string str=s.substr(left,right-left+1);
        string rstr=str;
        reverse(str.begin(),str.end());
        if(str==rstr)
            return true;
        return false;
    }
    int minCut(string s) {
        int len=s.size();
        //判断字符串整体是否回文
        if(ispal(s,0,len-1))
        {
            return 0;
        }

        vector<int> arr(len+1);
        //初始状态
        for(int i=1;i<=len;i++)
        {
            arr[i]=i-1;
        }
        for(int i=2;i<=len;i++)
        {
            if(ispal(s,0,i-1))
                arr[i]=0;
            else
            {
                for(int j=i-1;j>0;j--)
                {
                    if(ispal(s,j,i-1)&&((arr[j]+1)<arr[i]))
                    {
                        arr[i]=arr[j]+1;
                    }
                }
            }
        }
        return arr[len];
    }
};