HJ52 计算字符串的编辑距离

描述
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;
}

这答案是错的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿王啊子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值