题目
给定一个由不同的小写字母组成的字符串,输出这个字符串的全排列数量。
我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z'。
输入
每组输入只有一行,是一个由小写字母组成的字符串(不含相同字母),已知字符串的长度在1到6之间。(注意有多组输入)
输出
输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:
已知S = s1s2...sk T = t1t2...tk,则S < T 等价于,存在p (1 <= p <= k),使得
s1 = t1 s2 = t2 ... sp - 1 = tp - 1 sp < tp成立。
注意每组样例输出结束后接一个空行。
分析
通过使用递归将大问题变成小问题,从一个字母进行排列,到两个字母进行排列....一直到n个字母进行排列。
代码
//全排列
#include <stdio.h>
#include <string.h>
int func(char a[], int k) {int i, temp;static int count = 0;if (k == strlen(a)) {count++;/*printf("%s\n", a);*/}for (i = k; i < strlen(a); i++) {temp = a[k];a[k] = a[i];a[i] = temp;func(a, k + 1);temp = a[k];a[k] = a[i];a[i] = temp;}return count;
}
int main()
{char a[26];int i = 0;while (scanf("%s", &a)!=EOF){i = func(a, 0);printf("%d\n", func(a, 0)-i);}return 0;
}
这里的减i是因为该题目的要求是多组输入,所以i是减去上一组的个数。