当前位置: 首页 > 知识库问答 >
问题:

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

程彭祖
2023-03-14

打印排列-字符串

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

样本输入:

美国广播公司

样本输出:

abc acb bac bca驾驶室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;
}

共有1个答案

司英飙
2023-03-14

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

首先从PrintPermutions函数:

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

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

第二个是在printCurrentString函数中

result[level] = input[i];

由于不知道结果中字符串的实际大小,所以不知道级别是否是有效索引。这可能是出界了。索引越界也会导致UB。

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

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

考虑到内存泄漏(您不需要删除新的内存),我还建议您使用std::vector

 类似资料:
  • 情况是这样的。我正在根据从数据库获取的数据动态生成要在JPanel上显示的组件。系统会提示用户输入一个整数,并根据该整数进行一些计算。输出应以十进制值形式给出。因此,我将答案分配给了一个double,并使用decimalformat进行格式化。 当我将double值传递给DecimalFormat的format()方法时,即使我没有输入任何值为0,也会出现错误。 生成错误的代码段, 请考虑变量和是

  • 例如,给定长度=4,排列的可能数目/计数=24,12,6,4,1 1234=24排列 1123=12排列 1122=6排列 1112=4排列 1111=1排列 长度4=24,12,6,4,1 长度5=? 长度6=? 我想强调的是,我只得到了要排列的“字符串长度”,而不是实际的字符串本身。

  • 大家好,这是我在工作面试中遇到的一个基本问题,我正试图用Java实现输入字符串的所有排列,不幸的是,我无法实现这一点。

  • 我在Linux中使用的Java版本是: OpenJDK版本“16.0.2”2021-07-20 OpenJDK运行时环境(构建16.0.2+7) OpenJDK 64位服务器VM(构建16.0.2+7,混合模式) 这是我从Head-First Java书中编译的代码: 为什么那个特殊字符(%)会出现在字符串的末尾,我如何编写代码来去掉它?

  • 如果我想将char数组中的前3个字符作为双精度字符进行解析,而忽略以下字符,那么我真的需要这样做吗? 难道没有一个像这样的函数允许您指定它应该搜索的数字的最大字符串长度吗? 编辑:我希望它打印(它目前这样做),而不是!

  • 问题内容: 我正在尝试从Java字符串中找到所有三个字母子字符串。 例如,从字符串“ example string”中,我应该得到“ exa”,“ xam”,“ amp”,“ mpl”,“ ple”,“ str”,“ tri”,“ rin”,“ ing”。 我尝试使用Java正则表达式“([[a-zA-Z]){3}”,但仅得到“ exa”,“ mpl”,“ str”,“ ing”。 有人可以告诉我