给一个字符串,求它的全排列。
如输入“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是只读的!!
浙公网安备 33010602011771号