[算法设计]字符串全排列(去除重复项)

#include<stdio.h>

char Compare[100][100];
int count = 0;

void Swap(char *x, char *y) {//指针类型传递的交换函数 
    char temp = *y;
    *y = *x;    
    *x = temp;
}

void Perm(char list[],int k,int m){
    if(k == m){
        int flag1 = 0;
        for(int i = 0;i<count;i++){
            int flag2 = 0;//相同 
            for(int j = 0;j<m;j++){
                if(Compare[i][j]!=list[j]){
                    flag2 = 1;//不同
                    break; 
                }
            }
            if(flag2 == 0){
                flag1 = 1;//相同 
                break;
            } 
        }
        if(flag1 == 0){//不同 
            for(int i = 0;i<m;i++){
                printf("%c",list[i]);
            }
            for(int i = 0;i<m;i++){
                Compare[count][i] = list[i];
            }
            count++;
            printf("\n");
        }    
        
    }else{
        for(int i = k;i<m;i++){
            Swap(&list[k],&list[i]);
            Perm(list,k+1,m);
            Swap(&list[k],&list[i]);
        }
    }
}


int main (void)
{
    int n;
    printf("请输入数:\n");
    scanf("%d",&n);
    getchar();
    char s[n+1];
    gets(s);
    s[n] = '\0';
    //puts(s);
    printf("全排列如下:\n");
    Perm(s,0,n);
    printf("%d\n",count); 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值