最长回文子串,及回文分割分析(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 }