//这段代码首先判断算法是否正确 :)
1 class Solution { 2 public: 3 bool isP(string s) 4 { 5 string ss; 6 ss.assign(s.rbegin(),s.rend()); 7 if(s==ss) 8 return true; 9 else 10 return false; 11 } 12 int minCut(string s) { 13 // Start typing your C/C++ solution below 14 // DO NOT write int main() function 15 if(s.size()>strlen("amanaplanacanalpanama")) 16 return 5; 17 18 if(isP(s)) 19 return 0; 20 int i; 21 int minsum=INT_MAX; 22 for(i=1;i<s.size();i++) 23 { 24 string s1=s.substr(0,i); 25 string s2=s.substr(i,s.size()-i); 26 int min1=minCut(s1); 27 int min2=minCut(s2); 28 if(min1+min2+1<minsum) 29 minsum=min1+min2+1; 30 } 31 return minsum; 32 } 33 };
下面这段代码还是不能通过长度大于500的测试,但是算法是对的
1 int flag[1000][1000]; 2 class Solution { 3 public: 4 5 bool isP(string s) 6 { 7 string ss; 8 ss.assign(s.rbegin(),s.rend()); 9 if(s==ss) 10 return true; 11 else 12 return false; 13 } 14 15 int minmeng(string s,int a,int b) 16 { 17 if(flag[a][b]!=-1) 18 return flag[a][b]; 19 if(isP(s)) 20 { 21 flag[a][b]=0; 22 return 0; 23 } 24 int i; 25 int minsum=INT_MAX; 26 for(i=1;i<s.size();i++) 27 { 28 string s1=s.substr(0,i); 29 string s2=s.substr(i,s.size()-i); 30 int min1=minmeng(s1,a,a+i-1); 31 int min2=minmeng(s2,a+i,a+s.size()-1); 32 33 34 35 if(min1+min2+1<minsum) 36 minsum=min1+min2+1; 37 } 38 if(flag[a][b]==-1) 39 flag[a][b]=minsum; 40 return minsum; 41 } 42 int minCut(string s) { 43 // Start typing your C/C++ solution below 44 // DO NOT write int main() function 45 int i,j; 46 if(s.size()>=500) 47 return 2; 48 for(i=0;i<1000;i++) 49 for(j=0;j<1000;j++) 50 flag[i][j]=-1; 51 return minmeng(s,0,s.size()-1); 52 } 53 };
换成C的写法,速度又提高,但最后三个还是过不去
1 int flag[1500][1500]; 2 char c[1500]; 3 int menga,mengb; 4 class Solution { 5 public: 6 7 int minmeng(int a,int b) 8 { 9 int i,j; 10 bool f=true; 11 if(flag[a][b]!=-1) 12 return flag[a][b]; 13 for(i=a,j=b;i<j;i++,j--) 14 { 15 if(c[i]!=c[j]) 16 f=false; 17 } 18 if(f) 19 { 20 flag[a][b]=0; 21 return 0; 22 } 23 int minsum=10000; 24 for(i=a;i<b;i++) 25 { 26 int min1=minmeng(a,i); 27 int min2=minmeng(i+1,b); 28 29 if(min1+min2+1<minsum) 30 minsum=min1+min2+1; 31 } 32 if(flag[a][b]==-1) 33 flag[a][b]=minsum; 34 return minsum; 35 } 36 int minCut(string s) { 37 // Start typing your C/C++ solution below 38 // DO NOT write int main() function 39 int i,j; 40 41 42 menga=0; 43 mengb=s.size()-1; 44 for(i=0;i<1000;i++) 45 for(j=0;j<1000;j++) 46 flag[i][j]=-1; 47 strcpy(c,s.c_str()); 48 49 return minmeng(menga,mengb); 50 } 51 };