我们提供安全,免费的手游软件下载!

安卓手机游戏下载_安卓手机软件下载_安卓手机应用免费下载-先锋下载

当前位置: 主页 > 软件教程 > 软件教程

编辑距离

来源:网络 更新时间:2024-08-24 09:35:37

编辑距离是指在两个字符串之间,通过插入、删除、替换等操作,将一个字符串转换成另一个字符串所需的最少操作次数。本文将介绍编辑距离的动态规划解法,并提供相应的代码实现。

题目叙述

给定两个字符串a和b,求从字符串a转换为字符串b所需的最小编辑距离。

输入

NOTV
LOVER

输出

4

题目解释:

动态规划思路

编辑距离问题可以使用动态规划来解决。首先,我们需要考虑子问题,然后建立状态变量和递推公式。

状态变量的含义

我们使用dp数组作为状态变量,其中dp[i][j]表示从a的前i个字符转换为b的前j个字符所需的编辑距离。

递推公式

根据状态变量,我们可以得到递推公式:

  • 若a[i]等于b[j],则dp[i][j]等于dp[i-1][j-1]。
  • 若a[i]不等于b[j],则dp[i][j]等于min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j]) + 1。

遍历顺序

遍历顺序为从上到下,从左到右。

初始化dp数组

初始化dp数组的边界条件为dp[i][0]=i和dp[0][j]=j。

m=strlen(a);
n=strlen(b);
for(int i=1;i<=m;j++) dp[i][0]=i;
for(int j=1;j<=n;j++) dp[0][j]=j;
for(int i=1;i<=m;i++){
    for(int j=1;j<=n;j++){
        if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1];
        else dp[i][j]=min(dp[i-1][j-1],min(dp[i][j-1],dp[i-1][j])+1);
    }
}
cout<

举例打印dp数组

代码

以下是最终实现的代码:

#include
#include
#include
using namespace std;

char a[2005],b[2005];
int f[2005][2005];

int main(){
  scanf("%s %s",a,b);
  int la=strlen(a), lb=strlen(b);
  for(int i=1;i<=la;i++) f[i][0]=i;
  for(int i=1;i<=lb;i++) f[0][i]=i;
      
  for(int i=1;i<=la;i++)
    for(int j=1;j<=lb;j++)
      if(a[i-1]==b[j-1]) f[i][j]=f[i-1][j-1];
      else f[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1;

  printf("%d\n",f[la][lb]);
}