算法 字符全排列

算法概述

  • 运用递归的思想,任取一个字符打头,对后面n-1个数进行全排列,要求n-1个数的全排列就任选一个数不懂,对后面n-2个数的全排列.....直到只有一个字符了,即找到了出口,输出字符串。

  • 而避免重复元素就要多一个判断条件,判断该字符是否和前面的数组里的字符相等,相等的话就直接用continue跳过循环即可。

  • 他轮流换字符打头的时候记得要换回来,要不然数组的顺序改变了,字符打头会发生重复。

    #include<stdio.h>
    #include<iostream>
    using namespace std;
    //重复元素的判断条件
    bool check(char *arr,int k,int n){
        for(int i=k;i<n;i++){
            if(arr[i]==arr[n])return false;//判断前面是否已经出现过这个字符,如果出现过就返回false,没出现过就出现true; 
        }
        return true;
    }
    void exchange(char &a,char &b){//交换两个字符 
            char c;
            c=a;
            a=b;
            b=c;
    }
    
    void perm(char *arr,int k,int n,int &count){
        if(k==n){
            cout<<arr[0];//函数到达最后一层只有一个数没法全排列了就输出 
            for(int i=1;i<n;i++){
                cout<<arr[i];
            }
            cout<<endl;
            count++;
        }
        else{
            for(int i=k;i<n;i++){
                if(check(arr,k,i)){//重复元素的判断条件
                    exchange(arr[k],arr[i]);//交换保持不变的数的值 
                    perm(arr,k+1,n,count);//递归求全排列 
                    exchange(arr[k],arr[i]);//交换回来 
                }
            }
        }
    }
    int main(){
        int n;
        scanf("%d",&n);
        char arr[n];
        for(int i=0;i<n;i++){
            cin>>arr[i];
        }
        int count=0;
        perm(arr,0,n,count);
        cout<<count;
    } 

     

posted @ 2021-04-28 11:07  ....陈陈陈陈  阅读(72)  评论(0)    收藏  举报