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

函数C中的回文返回false

桓嘉谊
2023-03-14

出于某种原因,在下面的递归函数中,

#include <iostream>
#include <string.h>
using namespace std;

int n, m, p = 0;
char A[510][510];

void DFS(int x, int y, string s){
    if(x == n && y == m){
        if (s == string(s.rbegin(), s.rend())) p++;
    } else {
        if(x < n) DFS(x+1, y, s + string(1, A[x][y]));
        if(y < m) DFS(x, y+1, s + string(1, A[x][y]));
    }
}

int main() {
    // your code goes here

    cin>>n>>m;
    for(int i = 0; i<n; i++)
        for(int j = 0; j<m; j++)
            cin>>A[i][j];

    string s = "";
    DFS(0, 0, "");
    cout<<p<<endl;
    return 0;
}

永远不递增p,也就是说字符串s永远不是一个回文,尽管在我的程序中,s确实是一个回文,次数相当少。但是在下面一行中它仍然返回false

if (s == string(s.rbegin(), s.rend()))

是因为功能吗?s采用的一些值为:aaa、aba、AAAA、abbb、bab

我已确保s中没有前后空格

P、 S:我已经检查过了,x==n

示例输入:

3 4
aaab
baaa 
abba

输出0。回文:aaaaaa、abaaba、aaaaaa

共有1个答案

慕容越泽
2023-03-14

您的问题出在以下几行:

    if(x < n) DFS(x+1, y, s + string(1, A[x][y]));
    if(y < m) DFS(x, y+1, s + string(1, A[x][y]));

在第一行中,可能是y==m,在第二行,可能是x==n

然后,这些值用于访问有效输入范围之外的A。现在这些值被初始化为零,这将导致“\0”字符被添加到字符串中,这对于std::string,是完全有效的,它可以包含该字符,它不标记字符串的结尾,就像在C字符串中一样!即使在打印时,它们也会被跳过,而不是在那里结束该字符串的打印。

要验证这一点,在反转之前,除了字符串内容之外,请尝试打印字符串的长度。你会注意到长度总是7,即使打印的字符串更短。然后,当你用这些零字节反转字符串时,它们也被反转,所以你最终得到的反转字符串在开头有零字节(被跳过,打印时不可见),而original在结尾有零字节,所以它们是不同的。

现在,我将为您实际修复算法,但粗略的解决方案是在反转字符串之前删除尾随零。

 类似资料:
  • C++ 数组 C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。 如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:int * myFunction() { . . . } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 现在,让我们来看下面的函数,它会生成 10 个随机数,并

  • 请帮帮忙 我正在用VisualBasic2010用C写一个程序,这个程序叫做“回文整数”。我需要写两个函数,一个是//返回整数的倒数。例如,reverse(456)返回654//并带有标题:-- 倒整数(整数) 我需要写另一个函数,//返回true,如果数字是一个回文//标题:- bool isPalindrome(整数) 我需要使用reverse函数来实现isAlindrome函数。如果一个数字

  • 函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。 return 语句的一般形式为: 或者: 有没有 都是正确的,为了简明,一般也不写 。例如: 对C语言返回值的说明: 1) 没有返回值的函数为空类型,用 表示。例如: 一旦函数的返回值类型被定义为 void,就不能再接收它的值了。例如,下面的语句是错误的: 为了使程序有良好的可读性并减少出错,

  • 我在玩C语言中的函数指针只是为了学习。我尝试调用一个空函数,并将其结果设置为int。 我从中得到的结果是: 在对它进行了一点研究之后,我意识到main正在函数()中打印printf语句中的字符数。为什么会这样?这是预期产出吗?

  • C++ 指针 在上一章中,我们已经了解了 C++ 中如何从函数返回数组,类似地,C++ 允许您从函数返回指针。为了做到这点,您必须声明一个返回指针的函数,如下所示: int * myFunction() { . . . } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 现在,让我们来看下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第

  • 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = 0 for n in args: ax = ax + n return ax 但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回