网上有一些解决这个问题的方法,但是解释的不够简洁。这里给出较简单的解释和实现。
如果你用过回溯算法的话,这个题目算是弱爆了。就是在排列树空间里遍历了一边。。
现在从头开始解决这个问题,对于长度位n的字符串(假设所有字符均不相同)有n!个排列。
这就很自然的想到了排列树嘛,在排列树里搜索什么呢? 什么都不用做,遍历到叶节点后打印搜索路径就好了。
回溯的搜索路径就在原数组上,打印出来就好了。
下面给出代码实现:
#include<stdio.h>
#include<string.h>
void swap(char* a,char* b){
char c=*a;
*a = *b;
*b = c;
}
void stringPermutationBk(char* str,int t){
int len=strlen(str);
if (t == len-1) {
puts(str);
return;
}
for ( int i=t; i < len; ++i){
swap(str+t, str+i);
stringPermutationBk(str,t+1);
swap(str+t,str+i);
}
}
int main(){
char str[]="abcdef";
stringPermutationBk(str,0);
}
如果上面代码看不懂,说明你该复习下回溯算法了。这是最简单的一个了,呵呵。