回文字符串
2014-04-30 18:35
218 查看
#include<stdio.h> #include<string.h> int a[27],vis[11],len,k,t,cnt; char str[11],temp[6],b_str[6],jd_str[121][6],c; int judge() { int i; for(i = 0;i < t;i ++) if(!strcmp(jd_str[i],temp)) return 0; strcpy(jd_str[t++],temp); return 1; } void dfs(int n) { int i,j; if(n == len && judge()) { printf("%s",temp); if(cnt == 1) printf("%c",c); for(j = len-1;j > 0;j --) printf("%c",temp[j]); printf("%c\n",temp[0]); return ; } for(i = 0;i < len;i ++) { if(!vis[i]) { vis[i] = 1; temp[k++] = b_str[i]; dfs(n+1); k--; vis[i] = 0; } } } int main() { int i,j,m; while(~scanf("%s",str)) { memset(temp,0,sizeof(temp)); memset(vis,0,sizeof(vis)); memset(a,0,sizeof(a)); memset(b_str,0,sizeof(b_str)); m = k = 0; t = cnt = 0; len = strlen(str); for(i = 0;i < len;i ++) a[str[i]-'a']++; for(i = 0;i < 27;i ++) { if(a[i] % 2) { cnt++; c = i+'a'; } if(cnt > 1) break ; } if(cnt > 1) //判断是否有回文存在 printf("no palindrome!\n"); else if(len == 1) printf("%s\n",str); else { for(i = 0;i < 27;i ++) { for(j = 0;j < a[i] >> 1;j ++) b_str[m++] = i+'a'; } len = strlen(b_str); dfs(0); } } return 0; }