C++ 函数C+中的回文返回false+;
出于某种原因,在下面的递归函数中C++ 函数C+中的回文返回false+;,c++,string,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++;
#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;
}
是因为功能吗?
s采用的一些值是:aaa、aba、aabaa、abb、bab
我已确保s
附言:我已经检查过,x==n&&y==m确实实现了
输入示例:
3 4
aaab
baaa
abba
输出0。回文:aaaaaa,abaaba,aaaaaa您的问题在于以下几行:
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]));
if(x
在第一行,它可能是y==m
,在第二行,它可能是x==n
然后使用这些值访问有效输入范围之外的A
。现在,这些值被初始化为零,这将导致字符串中添加'\0'
字符,该字符对std::string
完全有效,它可以包含该字符,而不标记字符串的结尾,就像在C字符串中一样!即使在打印时,它们也只是被跳过,而不是在那里结束该字符串的打印
要进行验证,请在反转字符串之前,尝试打印字符串的长度以及字符串内容。您会注意到长度始终为7,即使打印的字符串较短。然后,当你用这些零字节反转字符串时,它们也会被反转,因此你最终得到的反转字符串的开头是零字节(打印时跳过且不可见),而original的结尾是零字节,因此它们是不同的
现在,我将为您实际修复算法,但粗略的解决方案是在反转字符串之前删除尾随零。也许您应该使用调试器,查看
字符串(s.rbegin(),s.rend())
的结果是什么,以及字符串是否实际等于s
的内容。我已经这样做了。结果是s和反s都有相同的值@上尉很讨厌。我甚至打印了这样的字符串:s:aba:d:aba:如果比较失败,要么字符串不一样,要么代码中的其他地方有一个bug对比较或其他相关代码产生了影响。代码中的其他地方有bug吗?这对代码的这一部分有什么影响?这可能是因为我将字符串作为参数传递?不知为什么,这就是原因吗@在这种情况下,请尝试将中间值(在本例中为反向字符串)放入临时变量,并将其与s一起打印,以查看是否首先达到了比较,并查看值的确切值。感谢您的解释!
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]));