写一个函数输出一个字符串中的所有排列

     我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交换之前,先要把ba交换回来。在交换ba之后,再拿c和处在第一位置的a进行交换,得到cba。我们再次固定第一个字符c,求后面两个字符ba的排列。

#include<iostream.h>

 bool repeatnumber(char *bg,char *pch)
{
    bool f=false;
    for(char *q=bg;q!=pch;q++)
        if(*q==*pch)
        {
            f=true;
            break;
        }
    return f;
}

 void pailie(char *ch,char *bg)
{    

    if(*bg=='\0')
        cout<<ch<<endl;
    else
    {    
        char tmp;
        for(char *pch=bg;*pch!='\0';pch++)
        {
        
            /*为了防止字符串中有相同的字符而造成排除的序列一样
            而设置repeatnumber()函数进行检查,从bg到pch-1中间是不是
            有和pch相同的字符,如果有就说明已经和前面的bg互换完成
            不需要继续互换否则就会重复直接下一步

            */ 
            
            if(bg!=pch&&repeatnumber(bg,pch))
                continue;

            tmp = *bg;
            *bg = *pch;//开始这里面一直报错,错误原因如下图,感谢csdn网友Fire_Lord的帮助
            *pch = tmp;
        
            sequence(ch,bg+1);
        
            tmp = *bg;
            *bg = *pch;
            *pch = tmp;
        }
    }
}    

void  main()
{
    char ch[]="abcde";
    
    pailie(ch,ch);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值