我遇到了黑客排名中的问题"TWO STRINGS"的三个测试用例的分段错误。原因是什么?



代码如下: 问题的链接是:两个字符串

#include <bits/stdc++.h>
using namespace std;
// Complete the twoStrings function below.
string twoStrings(string s1, string s2) 
{
long long int  i,j;
long long int  m=s1.length();
long long int n=s2.length();
long long int dp[m+1][n+1];
for(i=0;i<=m;i++)
{
for(j=0;j<=n;j++)
dp[i][j]=0;
}
int count=0;
for(i=0;i<=m;i++)
{
for(j=0;j<=n;j++)
{
if(i==0||j==0)
dp[i][j]=0;
else if (s1[i-1]==s2[j-1])
{
dp[i][j]++;
count++;
}
}
}
if(count>0)
{
return "YES";
}
else
{
return "NO";
}

}
int main()
{
ofstream fout(getenv("OUTPUT_PATH"));
int q;
cin >> q;
cin.ignore(numeric_limits<streamsize>::max(), 'n');
for (int q_itr = 0; q_itr < q; q_itr++) {
string s1;
getline(cin, s1);
string s2;
getline(cin, s2);
string result = twoStrings(s1, s2);
fout << result << "n";
}
fout.close();
return 0;
}

它非常适合 6 个测试用例中的 9 个。 我不认为时间是这里的问题。 它显示了分段错误,但没有详细说明问题的实际问题所在。任何帮助将不胜感激。我无法弄清楚问题是什么

  1. 通过在本地测试来调试此类问题很有帮助,您可以在代码中添加cout调试语句,以确定段错误何时发生。 如果您可以下载导致失败的确切测试用例,则可以在本地运行该测试用例。

  2. 问题语句指出,两个字符串的输入大小可以各10^5。 如果它们都是10^5,那么您的 DP 阵列的大小将是10^5 * 10^5 = 10^1010^10字节是 10 GB,这可能比允许的要多,我认为long longs像 8 个字节?所以它将是 80 GB。

  3. 你似乎把这个问题想多了。 考虑他们给出的第一个示例:s1 = hellos2 = world,结果应该是true的,因为这两个词共享一个共同的子字符串:o。 应该有一种更简单的方法来解决问题,而不是将每个字符从s1到每个字符进行比较s2

最新更新