dp[i] - s的前i位需要最少的cut数
dp[i] = min(dp[i], dp[j]+1)
initialize dp[0] to -1 用来跟+1抵消
class Solution {
public:
int minCut(string s) {
int n = s.size();
if(n<2) return 0;
vector<int> dp(n+1, n);
dp[0] = -1;
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
if(isvalid(s.substr(j, i-j))){ //i-1-j+1=i-j
dp[i] = min(dp[i], dp[j]+1);
}
}
}
return dp[n];
}
bool isvalid(string s){
int l=0, r=s.size()-1;
while(l<r){
if(s[l]!=s[r]) return false;
l++;
r--;
}
return true;
}
};
利用DP进一步优化[check是不是回文]的部分
class Solution {
public:
int minCut(string s) {
int n = s.size();
if(n<2) return 0;
vector<int> dp(n+1, n);
vector<vector<bool>> p(n, vector<bool>(n, false));
for(int i=0;i<n;i++){
p[i][i] = true;
}
for(int i=0;i<n-1;i++){
if(s[i]==s[i+1]) p[i][i+1]=true;
}
dp[0] = -1;
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
if(s[j]==s[i-1] && (i-1-j<=1 || p[j+1][i-2])){
p[j][i-1]=true;
dp[i] = min(dp[i], dp[j]+1);
}
}
}
return dp[n];
}
};