为什么我得到长度仅为 3 的字符串排列的输出?
Why am i getting output for permutations of a string of length only 3?
打印排列 - 字符串
给定一个字符串,查找并打印输入字符串的所有可能排列。 注意:排列的顺序并不重要。只需将它们打印在不同的行中即可。
示例输入 :
美国广播公司
示例输出:
美国广播公司 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
,并且通过引用传递此向量。
相关文章:
- 找到具有最多子串栅栏的字符串排列
- 为什么我得到长度仅为 3 的字符串排列的输出?
- 如何排列二进制字符串以最小化它们之间的距离
- C++按字母顺序排列的字符串数组
- 有没有一种 STL 方法可以找到字符串的所有排列,给出一个以 C++ 为单位的大小?
- 如何在 c++ 中按字母顺序排列数组中的字符串?
- 在c++中生成字符串的排列
- 从给定字符串中查找长度 k 的所有排列/组合
- C++ 字符串的排列,输出的结果小于或等于字符串的长度
- 生成具有条件的给定字符串的排列
- 从左到右打印字符串的组合(不是排列)c++
- 如何找到通过仅移动相邻字符创建的字符串的排列?-C++
- 如何在C++中分隔和排列名字和全名字符串
- 如何从长度为 n 的字符串中获取 lengh k 的所有唯一排列的数量
- 它如何排列单词以使用 qsort 和字符串
- 非递归二进制字符串排列生成器
- 生成没有重复项的字符串排列
- 字符串排列:如何去除重复排列
- 什么是可以高效打印字符串排列的算法?
- 字符串排列