分割回文串II

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回符合要求的最少分割次数。

示例:

输入: "aab"
输出: 1
解释: 进行一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。

class Solution {
public:
int ispalindrome(string s,int left,int right){
while(left<right){
if(s[left]==s[right]){
left++;
right--;
}
else{
break;
}
}
if(left<right){
return 0;
}
return 1;
}

int dfs(string s,int left,int right,vector<vector>&pa,vector<vector>&dp){
if(dp[left][right]!=-1)
return dp[left][right];
int res = right-left;
if(pa[left][right]1||ispalindrome(s,left,right)1){
pa[left][right]=1;
dp[left][right]=0;
return 0;
}
else{
pa[left][right]=0;
}
if(left==right)
{
dp[left][right]=1;
return 1;
}

for(int i=left;i<right;i++){
res = min(res,dfs(s,left,i,pa,dp)+dfs(s,i+1,right,pa,dp)+1);
}
dp[left][right]=res;
return res;
}
int minCut(string s) {
vector<vector>pa(s.size(),vector(s.size(),-1));
vector<vector>dp(s.size(),vector(s.size(),-1));
return dfs(s,0,s.size()-1,pa,dp);
}
};

posted @ 2019-10-31 22:45  夜深不自知  阅读(186)  评论(0)    收藏  举报