专栏文章
关于编辑距离
算法·理论参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miq6bxuz
- 此快照首次捕获于
- 2025/12/03 23:40 3 个月前
- 此快照最后确认于
- 2025/12/03 23:40 3 个月前
编辑距离是针对二个字符串的差异程度的量化量测
常见分类及其定义
莱文斯坦距离
允许对一个字符串作任意次操作,每一次操作可以为删除、插入、替换字符串中的任何一个字元,求将该字符串编辑为另一个字符串最少的操作次数
LCS(最长公共子序列)距离
允许对一个字符串作任意次操作,每一次操作可以为删除、插入字符串中的任何一个字元,求将该字符串编辑为另一个字符串最少的操作次数
算法
莱文斯坦距离
考虑使用动态规划
定义两字符串分别为 , ,其第 个字符分别为 , ,长度分别为 , 。
定义 为 的前 个字符与 的前 个字符的编辑距离。
状态转移方程
解释
表示在 后插入 (或删除 )情况下的最小操作次数
表示在 后插入 (或删除 )情况下的最小操作次数
表示将 替换为 情况下及 时不做处理的最小操作次数
LCS(最长公共子序列)距离
状态转移方程
解释
在LCS距离中,替换操作相当于一次插入操作和一次删除操作
实现
C++
CPP#include<bits/stdc++.h>
using namespace std;
int main(){
string a, b;
cin >> a >> b;
int la=a.size(), lb=b.size();
int lev[2005][2005];
for(int i=0;i<=la;i++)lev[i][0]=i;
for(int j=0;j<=lb;j++)lev[0][j]=j;
for(int i=1;i<=la;i++){
for(int j=1;j<=lb;j++){
lev[i][j]=min(min(lev[i-1][j]+1, lev[i][j-1]+1), lev[i-1][j-1]+(a[i-1]!=b[j-1]));//莱文斯坦距离
//lev[i][j]=min(min(lev[i-1][j]+1, lev[i][j-1]+1), lev[i-1][j-1]+2*(a[i-1]!=b[j-1]));//LCA距离
}
}cout << lev[la][lb];
}
Python
PYTHONa=input()
b=input()
dp=[[0]*(len(b)+1) for i in range(len(a)+1)]
for i in range(len(a)+1):
for j in range(len(b)+1):
if min(i, j)==0:
dp[i][j]=max(i, j)
else:
dp[i][j]=min(
dp[i-1][j]+1,
dp[i][j-1]+1,
dp[i-1][j-1]+int(a[i-1]!=b[j-1])*2
)
print(dp[-1][-1])
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...