我正在使用 levenshtein 算法来满足这些要求:
当找到一个包含 N 个字符的单词时,在我的字典数据库中建议作为更正的单词是:
与找到的单词有1个字符差异的每个N个字符的字典单词。示例:找到的单词:bearn,字典单词:bears
每个 N+1 个字符的字典单词,其中 N 个字符等于找到的单词。示例:找到的单词:bear,字典单词:bears
每个包含 N-1 个字符的字典单词,其中 N-1 个字符等于找到的单词。示例:找到的词:熊,字典词:熊
我在 C++ 中使用这个 Levenshtein 算法的实现来查找单词的 Levenshtein 编号何时为 1(这是所有三种情况的 Levenshtein 编号),但是我该如何选择要建议的单词呢?我读过有关 Boyer-Moore-Horspool 和 Knuth-Morris-Pratt 的文章,但我不确定它们中的任何一个有什么帮助。
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int levenshtein(const string &s1, const string &s2)
{
string::size_type N1 = s1.length();
string::size_type N2 = s2.length();
string::size_type i, j;
vector<int> T(N2+1);
for ( i = 0; i <= N2; i++ )
T[i] = i;
for ( i = 0; i < N1; i++ ) {
T[0] = i+1;
int corner = i;
for ( j = 0; j < N2; j++ ) {
int upper = T[j+1];
if ( s1[i] == s2[j] )
T[j+1] = corner;
else
T[j+1] = min(T[j], min(upper, corner)) + 1;
corner = upper;
}
}
return T[N2];
}