由于某种原因,在以下递归函数中,
#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
答案 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。然后,当你用那些零字节反转字符串时,它们也会反转,所以你最终得到的反向字符串在开头是零字节(在打印时跳过并且不可见),而原始在最后有它们,所以它们是不同。
现在我将实际为您修复算法,但原始解决方案是在反转字符串之前删除尾随零。