为什么我得到长度仅为 3 的字符串排列的输出?

Why am i getting output for permutations of a string of length only 3?

本文关键字:字符串 排列 输出 为什么      更新时间:2023-10-16

打印排列 - 字符串

给定一个字符串,查找并打印输入字符串的所有可能排列。 注意:排列的顺序并不重要。只需将它们打印在不同的行中即可。

示例输入 :

美国广播公司

示例输出:

美国广播公司 ACB BAC BCA CAB CBA

#include <iostream>
#include <string>
using namespace std;
void printCurrentString(string input, string result, int count[], int level)
{
if (level == input.size())
{
cout << result << endl;
return;
}
else
{
for (int i = 0; i < input.size(); i++)
{
if (count[i] == 0)
continue;
else
{
result[level] = input[i];
count[i]--;
printCurrentString(input, result, count, level + 1);
count[i]++;
}
}
}
}
void printPermutations(string input)
{
char *result = new char[input.size()];
int *count = new int[input.size()];
for (int i = 0; i < input.size(); i++)
count[i] = 1;
printCurrentString(input, result, count, 0);
}
int main()
{
string input;
cin >> input;
printPermutations(input);
return 0;
}

两个主要问题,都会导致未定义的行为

首先从printPermutations函数:

char *result = new char[input.size()];

正如我的评论中提到的,这将分配内存,但不以任何方式初始化它。从此内存创建std::string是UB(未定义行为(的原因之一。

第二个是在printCurrentString函数中,你有

result[level] = input[i];

由于您不知道result中字符串的实际大小,因此您不知道level是否是有效的索引。它可能越界了。索引越界也会导致 UB。

您可以通过简单的更改来解决这两个问题: 在printPermutations函数中,不要以您的方式动态创建结果字符串。而是创建一个正确长度的适当std::string对象并传递它:

printCurrentString(input, string(input.length()), count, 0);

考虑到您拥有的内存泄漏(您不会delete[]new[]的内存(,我还建议您使用std::vector<int>表示count,并且通过引用传递此向量。