运行莱文斯坦代码时出现问题

There is a problem when I run Levenstein code

本文关键字:问题 代码 文斯坦 运行      更新时间:2023-10-16

在对Levenstein进行编程时,存在一个问题。它是从互联网中提取的代码。

代码如下:

#define MIN3(a, b, c) ((a) < (b) ? ((a) < (c) ? (a) : (c)) : ((b) < (c) ? (b) : (c)))
int levenshtein(char *s1, char *s2) {
unsigned int s1len, s2len, x, y, lastdiag, olddiag;
s1len = strlen(s1);
s2len = strlen(s2);
unsigned int column[s1len + 1];
for (y = 1; y <= s1len; y++)
column[y] = y;
for (x = 1; x <= s2len; x++) {
column[0] = x;
for (y = 1, lastdiag = x - 1; y <= s1len; y++) {
olddiag = column[y];
column[y] = MIN3(column[y] + 1, column[y - 1] + 1, lastdiag + (s1[y - 1] == s2[x - 1] ? 0 : 1));
lastdiag = olddiag;
}
}
return(column[s1len]);
}

问题在于语句:unsigned int column[s1len + 1];unsigned int s1len

错误:表达式必须具有常量值。

您遇到的问题是C++语言不支持可变长度数组 (VLA(。您从互联网上收集的代码可能/可能写成C,这是一种C++不同的语言,并且确实支持 VLA(自 C99 标准 IIRC 以来(。

可以使用std::vector容器代替 VLA,"修复"代码以使用标准C++。请务必包含<vector>头文件:

#include <vector>
//.. .
// unsigned int column[s1len + 1];  // NOT standard C++
std::vector<unsigned int>column(s1len + 1);

您可以使用矢量的[]运算符访问矢量的元素,因此不需要对代码进行任何其他更改。

注意:一些C++实现确实支持 VLA(我认为 GNU g++ 就是一个支持 VLA 的实现( - 但标准不支持。