我必须使用给定字符 ABC 为用户给出的长度生成一个字符串。假设如果用户给出 4 作为长度,那么代码应该显示如下:
AAAA
AAAB
AAAC
AABA
.
.
.
CCCC.
我可以生成字符串 ABC 的排列。但我的问题是,如果用户输入 4、5 或 6,而不是我如何生成仅包含 A、B、C 的 4、5 或 6 个字符的排列,请帮忙。能否请您提供代码或如何编码的步骤。
任何提示、想法或建议将不胜感激。
我必须使用给定字符 ABC 为用户给出的长度生成一个字符串。假设如果用户给出 4 作为长度,那么代码应该显示如下:
AAAA
AAAB
AAAC
AABA
.
.
.
CCCC.
我可以生成字符串 ABC 的排列。但我的问题是,如果用户输入 4、5 或 6,而不是我如何生成仅包含 A、B、C 的 4、5 或 6 个字符的排列,请帮忙。能否请您提供代码或如何编码的步骤。
任何提示、想法或建议将不胜感激。
将排列表示为数字系统中以 4 为基数的数字。将 A 映射到 0,将 B 映射到 1 C 到 2 和 D 到 3。遍历从 1 到 4 4 (256) 的所有数字,以 4 为基数表示每个数字并替换数字用字母。
你可以尝试这种类型的递归......这适用于任何字符出现一次的字符串......所以一点点就可以了,你不必交换那些相同的元素......假设你没有'不必将“A”与“A”或“B”与“B”交换。
void permute(char *a, int i, int n)
{
int j;
if (i == n)
printf("%s\n", a);
else
{
for (j = i; j <= n; j++)
{
swap((a+i), (a+j));
permute(a, i+1, n);
swap((a+i), (a+j)); //backtrack
}
}
}
这是一个已知的递归问题。
void f (char *dst, const char *src, int depth, int current) {
int i;
if (current >= depth) {
dst[depth] = '\0';
puts(dst);
} else {
for (i = 0; src[i] != '\0'; i++) {
dst[current] = src[i];
f (dst, src, depth, current + 1);
}
}
}