回文字符串

#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;
}


posted on 2014-04-30 18:35  wangzhili  阅读(107)  评论(0编辑  收藏  举报