Palindrome在函数C ++中返回false

时间:2015-08-13 18:17:17

标签: c++ string

由于某种原因,在以下递归函数中,

#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()))

是因为功能吗? 一些价值观是: aaa,aba,aabaa,abbb,bab

我确保 s

中没有前后空格

P.S:我已经检查过, x == n&amp;&amp; y == m 确实成真了。

示例输入:

3 4
aaab
baaa 
abba

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

1 个答案:

答案 0 :(得分:1)

你的问题在于以下几点:

    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' char被添加到字符串,这对std::string完全有效,它可以包含该字符,它不标记字符串的结尾,如在C字符串!即使在打印时,也只是跳过它们,而不是在那里结束那个字符串的打印。

要进行验证,请在反转之前尝试打印字符串内容以及字符串内容。即使打印的字符串较短,您也会注意到长度始终为7。然后,当你用那些零字节反转字符串时,它们也会反转,所以你最终得到的反向字符串在开头是零字节(在打印时跳过并且不可见),而原始在最后有它们,所以它们是不同。

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