字符串的全排列(數組方式)

全排列圖解過程


#include<cstdio>
#include<cstdlib>
#include<cstring>
void dg(char str[],int k){
     
     
     if(k==strlen(str)-1){
     
         for(int j=0;j<=k;j++){
                 printf("%c",str[j]);
         }
         printf("\n");
         return ;
     }
     //沒有重複字符的全排列 
     /*for(int i=k;i<strlen(str);i++){
         char temp=str[k];
         str[k]=str[i];
         str[i]=temp;
         dg(str,k+1);
         temp=str[k];
         str[k]=str[i];
         str[i]=temp;
     }  */
     //有重複字符的全排列 
     //因爲全排列是將不同元素依次換到當前位置後,再對後面的元素求全排列。
     //如果將重複的元素多次換到當前位置的話,那麼就會出現相同的排列。
     //爲了避免,我們禁止將相同的元素多次換到當前位置即可
     //這樣我們也得到了在全排列中去掉重複的規則:去重的全排列就是
     //從第一個數字起每個數分別與它後面非重複出現的數字交換。   
     for(int i=k;i<strlen(str);i++){
         int t=i,ok=0;
         for(int j=t+1;j<strlen(str);j++){
         if(str[t]==str[j])
             ok=1;
         }
         if(!ok){
         char temp=str[k];
         str[k]=str[i];
         str[i]=temp;
         dg(str,k+1);
         temp=str[k];
         str[k]=str[i];
         str[i]=temp;
         }
     }     
}
int main(){
    char s[]={'A','B','C'},s1[]={'A','B','B'};
    //dg(s,0);
    dg(s1,0);
    system("pause");
    return 0;
}


發佈了279 篇原創文章 · 獲贊 66 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章