// 状态: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];
}
};