最长回文子串,及回文分割分析(leetcode)

最长回文串:

引用地址:http://www.ituring.com.cn/article/57155

分析建一个二维表,设定P[i][j]:

1. true时,表示str[i..j]为回文

2. false时,表示str[i..j]不是回文

则,当:

1. i==j时,P[i][j]=true

2. j==i+1时,P[i][j]=str[i]==str[j]

3. 其他,P[i][j]=P[i+1][j-1]&&(str[i]==str[j])

 1 bool isPalindrome(char* str){
 2     int n=strlen(str);
 3     bool table[n][n];
 4     memset(table,0,sizeof(table));
 5     for(int i=0;i<n;i++)
 6         table[i][i]=1;
 7     for(int i=0,j=i+1;j<n;i++,j++)
 8         table[i][j]=(str[i]==str[j]);
 9     for(int gap=2;gap<n;gap++)
10         for(int low=0,high=low+gap;high<n;low++,high++)
11             table[low][high]=(table[low+1][high-1]&&str[low]==str[high]);
12     return table[0][n-1];
13 }

稍作改动就可以求最长回文子串

 1 int isPalindrome(char* str){
 2     int longest=1;
 3     int n=strlen(str);
 4     bool table[n][n];
 5     memset(table,0,sizeof(table));
 6     for(int i=0;i<n;i++)
 7         table[i][i]=1;
 8     for(int i=0,j=i+1;j<n;i++,j++){
 9         table[i][j]=(str[i]==str[j]);
10         if(str[i]==str[j])
11             longest=(j-i+1)>longest?(j-i+1):longest;
12     }
13     for(int gap=2;gap<n;gap++)
14         for(int low=0,high=low+gap;high<n;low++,high++){
15             table[low][high]=(table[low+1][high-1]&&str[low]==str[high]);
16             if(table[low+1][high-1]&&str[low]==str[high])
17                 longest=(gap+1)>longest?(gap+1):longest;
18         }
19     return longest;
20 }

最少回文分割(leetcode)需要再建一个二维表

分析:

1. ababbbabbababa最少4个字符串,分割三次:a|babbbab|b|ababa

2. 如果字符串整体是回文,则需要0次分割,最少1个字符串

引用:http://blog.csdn.net/ditian1027/article/details/26459661

 

 1 int isPalindrome(char* str){
 2     //建第一个表,判断是否为回文串
 3     int n=strlen(str);
 4     bool table[n][n];
 5     memset(table,0,sizeof(table));
 6     for(int i=0;i<n;i++)
 7         table[i][i]=1;
 8     for(int i=0,j=i+1;j<n;i++,j++)
 9         table[i][j]=(str[i]==str[j]);
10     for(int gap=2;gap<n;gap++)
11         for(int low=0,high=low+gap;high<n;low++,high++)
12             table[low][high]=(table[low+1][high-1]&&str[low]==str[high]);
13     //建第二个表,函数返回最小分割数,生成的回文字符串段数为分割数+1
14     int smallest=0;
15     int table2[n][n];
16     memset(table2,100,sizeof(table2));
17     for(int i=0;i<n;i++)
18         table2[i][i]=0;
19     for(int gap=1;gap<n;gap++)
20         for(int low=0,high=low+gap;high<n;low++,high++){
21             if(table[low][high]==true)
22                 table2[low][high]=0;
23             else{
24                 for(int i=0;i<gap;i++)
25                     table2[low][high]=(table2[low][low+i]+1+table2[low+i+1][high])<table2[low][high]?(table2[low][low+i]+1+table2[low+i+1][high]):table2[low][high];
26                 }
27         }
28     return table2[0][n-1];
29 }

 

 

 

 

 
posted @ 2014-09-10 20:41  liuzhiminxd  阅读(128)  评论(0编辑  收藏  举报