//这段代码首先判断算法是否正确  :)
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 };

 

posted on 2013-05-11 14:41  宇睿  阅读(185)  评论(0编辑  收藏  举报