在C ++中给出以下函数:
PS。在for循环中注意< =,因为vector的大小是[a.size()+ 1] [b.size()+ 1]
vector<int> lcs2(vector<int> &a, vector<int> &b)
{
vector<vector<int> >L(a.size() + 1 , vector<int>(b.size() + 1 , 0));
for (int i = 0; i <= a.size(); ++i)
{
for (int j = 0; j <= b.size(); ++j)
{
if (i == 0 || j == 0)
L[i][j] = 0;
else if (a[i - 1] == b[i - 1])
L[i][j] = L[i-1][j-1] + 1;
else
L[i][j] = std::max(L[i-1][j], L[i][j-1]);
}
}
int index = L[a.size()][b.size()];
vector<int> lcs(index + 1);
int i = a.size() , j = b.size();
while (i > 0 && j > 0)
{
if (a[i - 1] == b[j - 1])
{
lcs[index-1] = a[i-1];
i--; j--; index--;
}
else if (L[i - 1][j] > L[i][j - 1])
--i;
else
--j;
}
return lcs;
}
当我在main()函数中运行以下命令时:
vector<int> lcs = lcs2(a , b);
std::cout << lcs.size() << std::endl;
我可以在控制台上获得输出。但是,当我对代码进行以下更改时:
我无法在控制台上获得所需的输出。当我从VSCode运行构建任务时,我收到The terminal process terminated with exit code: 3221226356
之类的消息。
请帮我解决这个问题。
PS。在lcs2()中的return语句之前,如果我添加一个语句来打印lcs.size()的值,那么它也可以正常工作。
答案 0 :(得分:1)
你有一个循环
for (int i = 0; i <= a.size(); ++i)
然后在循环中访问a[i]
。当i == a.size()
时,这超出范围,因此您会得到未定义的行为。
尝试使用at
方法(使用a.at(i)
而不是a[i]
,并且类似地用于其他所有索引操作),并且您将获得异常而不是未定义的行为。