给定一个字符串 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<int>>&pa,vector<vector<int>>&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<int>>pa(s.size(),vector<int>(s.size(),-1));
vector<vector<int>>dp(s.size(),vector<int>(s.size(),-1));
return dfs(s,0,s.size()-1,pa,dp);
}
};
原文地址:https://www.cnblogs.com/qiuhaifeng/p/11774375.html
时间: 2024-11-06 09:42:01