算法与设计分析 | 全排列问题

题目

给定一个由不同的小写字母组成的字符串,输出这个字符串的全排列数量。
我们假设对于小写字母有'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 
#include 
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是减去上一组的个数。

你可能感兴趣的:(算法设计与分析,算法,开发语言)