classSolution{public:intminCut(string s){int n = s.size();//i-j之间是否为回文串vector<vector<int>>dp(n +2,vector<int>(n +2));for(int j =1; j <= n; j ++){for(int i = j; i >=1; i --){if(i == j) dp[i][j]=1;else{if(j- i +1==2){dp[i][j]=(s[i -1]== s[j -1]);}else{dp[i][j]=(s[i -1]== s[j -1]&& dp[i +1][j -1]);}}}}//记录1-r满足条件的所需要的最少的分割次数vector<int>f(n +1,1e5);for(int r =1; r <= n; r ++){if(dp[1][r]) f[r]=0;//说明已经满足是回文了else{f[r]= r -1;for(int l =1; l <= r; l ++){if(dp[l][r]){f[r]=min(f[r], f[l -1]+1);}}}}return f[n];}};