【发布时间】:2016-06-26 19:34:18
【问题描述】:
我在 interviewBit 的通配符模式匹配中遇到分段错误,我寻求帮助,但现在没有得到任何回应。 我正在使用 DP 来解决任务。 请帮我找出segFault的原因 问题链接——https://www.interviewbit.com/problems/regular-expression-match/
这是我在 C++ 中获取 segFault 的解决方案。
int Solution::isMatch(const string &s, const string &p) {
int n=s.size(),m=p.size();
bool dp[n+1][m+1];
for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)dp[i][j]=false;
dp[0][0]=true;
for(int j=1;j<=m;j++)
if(p[j-1]=='*')dp[0][j]=dp[0][j-1];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s[i-1]==p[j-1] || p[j-1]=='?')dp[i][j]=dp[i-1][j-1];
else if(p[j-1]=='*')
{
int v1=dp[i][j-1],v2=0;// Not Using
v2=(dp[i-1][j]|dp[i][j-1]);
dp[i][j]=(v1|v2);
}
else dp[i][j]=false;
}
}
return dp[n][m];
}
【问题讨论】:
-
好像你在运行时得到它,导致错误的字符串值是什么?
-
bool dp[n+1][m+1];这在 C++ 中是不合法的,C++ 中的数组必须使用编译时表达式声明为条目数。改用std::vector,不仅可以使其成为标准C++,而且可以帮助您调试问题,因为vector有一个at()函数,如果超出范围(而不是seg 错误)会引发异常。 -
@EmrahIzci 未提供字符串值!
-
@PaulMcKenzie 谢谢,我会尝试使用 Vectors...
-
@SandeepKumar 使用
std::vector<std::vector<bool>> dp(n+1, std::vector<bool>(m+1));并将使用[ ]的访问替换为at()(对于字符串和向量)。然后,如果超出范围,将抛出out_of_range异常而不是 seg 错误。然后,您只需要查看哪个访问引发了异常并解决问题。使用非标准数组和[ ]没有这个“调试功能”——只有at()有这些特点。
标签: c++ string segmentation-fault dynamic-programming