俊介三

一天更新一点,一天积累一点

导航

全排列

Posted on 2013-03-26 20:57  俊介三在前进  阅读(168)  评论(0)    收藏  举报

给一个字符串,求它的全排列。
如输入“abc”
输出“abc” "acb" "bac" "bca" "cab" "cba"

思路1:例如“abc”的情况,假如再来个“d”,那么怎么办呢?就是把“d”插入到原来排列的所有狭缝中。

思路2:对于每个,都有可能放在第一位,因此先放“a”在首位,后面跟着b和c的全排列。对于每个都如此操作即可。

思路2性能比较好,因为不用把中间结果保存着,再插入某个字母,又返回一个中间结果~

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;

int len;
void permutation(char* str, char* begin){
    if(*begin=='\0'){
        printf("%s\n",str);
        return;
    }
    char* ch;
    for(ch=begin ; *ch!='\0'; ch++){
        
        //如果不允许排列中有重复,先对字符串排序,再加这句话
        if(ch!=begin && *ch==*(ch-1)) continue;

        swap(*ch,*begin);
        permutation(str,begin+1);
        swap(*ch,*begin);
    }
}


int main(){
    char str[100] = "1123";
    len = strlen(str);
    permutation(str, str);

    //还可以使用STL进行全排
    puts("\n----------------\n");
    do{
        printf("%s\n",str);
        //此库函数默认去重
    }while(next_permutation(str,str+len));
    return 0;
}

 

PS,我被char str[100] = "abcde"的定义折腾死了!最初定义的是char str* = "abcd"....str[3]='A'这样赋值是非法的有木有!因为这样定义,str是只读的!!