描述
Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家 Levenshtein 提出的,故又叫 Levenshtein Distance 。
例如:
字符串A: abcdefg
字符串B: abcdef
通过增加或是删掉字符 ”g” 的方式达到目的。这两种方案都需要一次操作。把这个操作所需要的次数定义为两个字符串的距离。
要求:
给定任意两个字符串,写出一个算法计算它们的编辑距离。
数据范围:给定的字符串长度满足:
1≤len(str)≤1000
输入描述:
每组用例一共2行,为输入的两个字符串
输出描述:
每组用例输出一行,代表字符串的距离
示例1
输入:
abcdefg
abcdef
输出:
1
#include <iostream>
#include <cstring>
using namespace std;
void print(char *c1, char *c2 = nullptr, int length = 0);
void insert(int index, char c, char *cc, int lastIndex) {
cout << "lastIndex = " << lastIndex << endl;
for (int i = lastIndex; i >= index; --i) {
cc[i + 1] = cc[i];
}
cc[index] = c;
// print(cc, nullptr ,lastIndex+1);
}
void handle(char *c1, char *c2, int length, int whoLong, int &LevenshteinDistance) {
int index = 0;
for (; index < length; ) {
if (c1[index] == c2[index]) {
index++;
} else {
if (whoLong == 1) {
int c2Len = strlen(c2);
insert(index, c1[index], c2, c2Len);
LevenshteinDistance++;
} else {
int c1Len = strlen(c1);
insert(index, c2[index], c1, c1Len);
LevenshteinDistance++;
}
index = 0;
}
}
}
void init(char *c1, char *c2, string s1, string s2) {
int s1Len = s1.length(), s2Len = s2.length();
int lenMin = s1Len < s2Len ? s1Len : s2Len;
int lenMax = s1Len > s2Len ? s1Len : s2Len;
int index = 0;
bool isS1Long = s1Len > s2Len ? true : false;
for (; index < lenMin; ++index) {
c1[index] = s1[index];
c2[index] = s2[index];
}
for (; index < lenMax; ++index) {
if (isS1Long) {
c1[index] = s1[index];
} else {
c2[index] = s2[index];
}
}
}
void print(char *c1, char *c2, int length) {
cout << "c1 = ";
if (c1 != nullptr) {
for (int i = 0; i < length; ++i) {
cout << c1[i];
}
}
if (c2 != nullptr) {
cout << endl << "c2 = ";
for (int i = 0; i < length; ++i) {
cout << c2[i];
}
}
cout << endl;
}
int main() {
string s1, s2;
cin >> s1 >> s2;
int index1 = 0, index2 = 0, LevenshteinDistance = 0;
int len1 = s1.length(), len2 = s2.length();
int lenMax = len1 > len2 ? len1 : len2;
int whoLong = len1 > len2 ? 1 : 2;
char *c1 = new char[lenMax];
memset(c1, 0, lenMax);
char *c2 = new char[lenMax];
memset(c2, 0, lenMax);
init(c1, c2, s1, s2);
// print(c1, c2, lenMax);
handle(c1, c2, lenMax, whoLong, LevenshteinDistance);
print(c1, c2, lenMax);
cout << LevenshteinDistance;
}
这答案是错的!