您的位置:首页 > 编程语言 > C语言/C++

递归求解字符数组全排列问题

2017-11-26 10:18 253 查看
问题描述:

编写一个算法,就地生成字符数组 S[1..n]的所有排列,要求算法终止时S[1..n]保持 态成表使S 初始状 态。就地生成表示不使用S以外的数组。

算法分析:

因为是全排列问题,时间复杂度是O(n!),也是最优的时间复杂度。

算法设计:

/*
*递归求解字符数组的全排列
* */
#include <iostream>
#include <string>
using namespace std;
void swap(char &c,char &s){//在原地址上交换
char temp;
temp=c;
c=s;
s=temp;
}
void permute(string s,int n){
/*n==1时,把s打印出来,这时的s是其中一种全排列
*将原问题分解为n个子问题:
子问题1:生成n-1个元素s[1],…,s[n-1]的全排列后接s
;
子问题2:生成n-1个元素s[1],…,s[n-2],s
的全排列后接s[n-1];
…
子问题n:生成n-1个元素s[2],…,s
的全排列后接s[1];
*
* */
if(1==n)cout<<s<<endl;
else{
permute(s,n-1);//第一个子问题
int i;
for(i=n-2;i>=0;i--){//2-n个子问题
swap(s[i],s[n-1]);
permute(s,n-1);
swap(s[i],s[n-1]);
}
}
}

int main(){
string s="abc";
permute(s,3);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息