题目描述
Given a string s, partition s such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
For example, given s =“aab”,
Return1since the palindrome partitioning[“aa”,“b”]could be produced using 1 cut.
思路: 题目提示考的知识点为动态规划,想法1
想法1:分别从左往右和从右往左寻找满足条件的回文子串,取两者的最小值,发现通过不了,暂时还没想明白怎么回事
class Solution {
public:
bool check(string s)
{
if(s.size()==1) return true;
for(int i = 0;i<s.size()/2;i++)
{
if(s[i]!=s[s.size()-1-i]) return false;
}
return true;
}
int minCut(string s) {
int count = 0;
int min = 0;
string t = s;
if(s.empty()||s.size()==1||check(s)) return count;
for(int i = s.size()-1;i>0;)
{
string temp = s.substr(0,i);
if(check(temp))
{
count++;
s = s.substr(i,s.size()-i);
if(check(s)) break;
i = s.size()-1;
}
else i--;
}
s = t;
for(int i = s.size()-1;i>0;)
{
string temp = s.substr(s.size()-i,i);
if(check(temp))
{
min++;
s = s.substr(0,s.size()-i);
if(check(s)) break;
i = s.size()-1;
}
else i--;
}
return min<count?min:count;
}
};
不通过
您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为96.15%
测试用例:
“adabdcaebdcebdcacaaaadbbcadabcbeabaadcbcaaddebdbddcbdacdbbaedbdaaecabdceddccbdeeddccdaabbabbdedaaabcdadbdabeacbeadbaddcbaacdbabcccbaceedbcccedbeecbccaecadccbdbdccbcbaacccbddcccbaedbacdbcaccdcaadcbaebebcceabbdcdeaabdbabadeaaaaedbdbcebcbddebccacacddebecabccbbdcbecbaeedcdacdcbdbebbacddddaabaedabbaaabaddcdaadcccdeebcabacdadbaacdccbeceddeebbbdbaaaaabaeecccaebdeabddacbedededebdebabdbcbdcbadbeeceecdcdbbdcbdbeeebcdcabdeeacabdeaedebbcaacdadaecbccbededceceabdcabdeabbcdecdedadcaebaababeedcaacdbdacbccdbcece”
对应输出应该为:
273
你的输出为:
281
想法二,动态规划,0…i,i+1,…j,j+1…,如果i~j是回文,则cut[j+1] = min(cut[j+1],cut[i]+1)
int minCut(string s)
{
int len = s.length();
vector<int> minCuts(len+1);
for(int i=0;i<=len;i++)
minCuts[i] = i-1;//每个子串最大分割数=size-1
bool dp[len][len];
fill_n(&dp[0][0],len*len,false);
for(int j=1;j<len;j++)
{
for(int i=j;i>=0;i--)
{
if(s[i] == s[j] && (dp[i+1][j-1] || (j-i)<2))
{
dp[i][j] = true;
minCuts[j+1] = min(minCuts[j+1],1+minCuts[i]);
}
}
}
return minCuts[len];
}