用已知字符串s中的字符,生成由其中n個字符組成的所有字符的排列。設n小于字符串s的字符個數,其中s中的字符在每個排列中最多出現一次。 例如,對于s[]=”abc”,n=2,則所有字符的排列有:ba,ca,ab,cb,ac,bc。
算法思想:
使用遞歸完成該實例。
- 舉個例子:
- s = “abc”,n=2
- 則第一個perm(n,s),即perm(2,”abc”);
- 首先需要判斷w中的字符個數是否滿足,n=2>1,表示還沒有滿足
- 首先,從s的第一個元素開始,s[1] = ‘a’;
- 填充到w中,w[n-1]即,w[1] = ‘a’;
- 緊接著,進行一些調整,使得s1 = bc,n=1
- 進行同樣的perm,即perm(1,”bc”);同樣先進行判斷
- 選擇b填充到w中,在進入perm(0,”c”),判斷輸出
- 接著,回到上一層,perm(1,”bc”),再選擇字符”c”進入w
- 選擇c進入w之后,進行一些調整,將s1調整成這樣一個字符串s1=”cb”,
- 這樣進入perm(0,”b”),判斷輸出.
*
- 接著,進入第一層,由于ba,ca都已經輸出完畢,第一個元素從b開始進行選擇
- 首先將b放入w中,即w[1] = ‘b’;接著進行一些調整,將s1調整為s1 = “bac”;
- 進入perm(1,”ac”);
- 以此方式進行遞歸,完成。
下面是代碼實現部分:
~~~
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20
char w[N];
void perm(int n,char *s);
/**
* 用已知字符串s中的字符,生成由其中n個字符組成的所有字符的排列。
* 設n小于字符串s的字符個數,其中s中的字符在每個排列中最多出現一次。
* 例如,對于s[]="abc",n=2,則所有字符的排列有:ba,ca,ab,cb,ac,bc。
*/
int main()
{
char s[N];
int n;
printf("Please enter the char array:\n");
scanf("%s",&s);
printf("Please number:\n");
scanf("%d",&n);
perm(n,s); //調用排列函數
return 0;
}
/**
* 舉個例子:
* s = "abc",n=2
* 則第一個perm(n,s),即perm(2,"abc");
* 首先需要判斷w中的字符個數是否滿足,n=2>1,表示還沒有滿足
* 首先,從s的第一個元素開始,s[1] = 'a';
* 填充到w中,w[n-1]即,w[1] = 'a';
* 緊接著,進行一些調整,使得s1 = bc,n=1
* 進行同樣的perm,即perm(1,"bc");同樣先進行判斷
* 選擇b填充到w中,在進入perm(0,"c"),判斷輸出
* 接著,回到上一層,perm(1,"bc"),再選擇字符"c"進入w
* 選擇c進入w之后,進行一些調整,將s1調整成這樣一個字符串s1="cb",
* 這樣進入perm(0,"b"),判斷輸出.
*
* 接著,進入第一層,由于ba,ca都已經輸出完畢,第一個元素從b開始進行選擇
* 首先將b放入w中,即w[1] = 'b';接著進行一些調整,將s1調整為s1 = "bac";
* 進入perm(1,"ac");
* 以此方式進行遞歸,完成。
*/
void perm(int n,char *s){
if(n < 1){
//如果n小于1,表示w中的長度已經達到需要的長度
printf("%s\n",w);
return;
}else{
char s1[N]; //臨時變量存儲
strcpy(s1,s);
int i;
for(i = 0;*(s1+i);i++){
//從s1中選擇一個字符放入w對應的位置中
*(w+n-1) = *(s1+i);
//將從s1中被選擇的字符替換成第一個字符
*(s1+i) = *s1;
//將第一個字符換成被選擇的字符
*s1 = *(w+n-1);
perm(n-1,s1+1);
}
}
}
~~~
下面是程序的運行結果:

總體來說,這個算法的思路還是比較簡單的。
- 前言
- 實例一:HelloWorld
- scanf函數學習
- 實數比較
- sizeof()保留字獲取類型的大小
- 自增/自減學習
- C學習if條件判斷和for循環
- C實現的九九乘法表
- C實現一個比較簡單的猜數游戲
- 使用C模擬ATM練習switch..case用法
- 記錄一個班級的成績練習一維數組
- C數組實現矩陣的轉置
- C二維數組練習
- 利用數組求前n個質數
- C實現萬年歷
- C實現數組中元素的排序
- C實現任意進制數的轉化
- C判斷一個正整數n的d進制數是否是回文數
- C使用遞歸實現前N個元素的和
- 鋼材切割問題
- 使用指針比較整型數據的大小
- 指向數組的指針
- 尋找指定元素
- 尋找相同元素的指針
- 整數轉換成羅馬數字
- 字符替換
- 從鍵盤讀入實數
- C實現字符行排版
- C實現字符排列
- C實例--判斷一個字符串是否是回文數
- 通訊錄的輸入輸出
- 撲克牌的結構定義
- 使用“結構”統計學生成績
- 報數游戲
- 模擬社會關系
- 統計文件中字符個數
- C實現兩個文件的內容輸出到同一個屏幕