字符串去反復全排列算法
阿新 • • 發佈:2018-11-01
得到 集合 1.4 http stdlib.h swap gets phoenix edi
【題目描寫敘述】
輸入一個字符串,打印出該字符串中字符的全部排列。
比如輸入字符串abc,則輸出由字符a、b、c 所能排列出來的全部字符串
abc、acb、bac、bca、cab 和 cba。
【分析】
從集合中依次選出每個元素。作為排列的第一個元素,然後對剩余的元素進行全排列,如此遞歸處理。從而得到全部元素的全排列。以對字符串abc進行全排列為例,我們能夠這麽做:以abc為例
- 固定a,求後面bc的排列:abc。acb,求好後,a和b交換。得到bac
- 固定b。求後面ac的排列:bac。bca,求好後,c放到第一位置,得到cba
- 固定c。求後面ba的排列:cba,cab。
<pre name="code" class="cpp">#include <stdio.h> #include <stdlib.h> #include <string.h> void swap(char *str, int begin, int k) { char tmp; tmp = *(str + begin); *(str + begin) = *(str + k); *(str + k) = tmp; } int is_swap(char *str, int begin, int k) { int i; for (i = begin; i < k; i ++) if(*(str + i) == *(str + k)) return 0; return 1; } void permutation(char *str, int begin, int end) { int k; if (begin == (end - 1)) { printf("%s\n", str); return; } for (k = begin; k < end; k++) if(is_swap(str, begin, k)) { swap(str, begin, k); permutation(str, begin + 1, end); swap(str, begin, k); } } int main(void) { char str[10]; int length; gets(str); length = strlen(str); printf("%d\n", length); permutation(str, 0, length); return 0; }
字符串去反復全排列算法