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

问题描述:
编写一个算法,就地生成字符数组 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[n]; 
     子问题2:生成n-1个元素s[1],…,s[n-2],s[n]的全排列后接s[n-1];
     …                      
     子问题n:生成n-1个元素s[2],…,s[n]的全排列后接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;
}

猜你喜欢

转载自blog.csdn.net/liunan199481/article/details/78635823