acwing 902 最短编辑距离

简介: acwing 902 最短编辑距离

活动 - AcWing

优题解:AcWing 902. 最短编辑距离 - AcWing

一共有三个操作方式:

1.删除操作:插入操作之前即前 i - 1 个和 前 j 已经排好 即 f[i-1][j] + 1 ;

2.插入操作:删除操作之前即前 i 个和 前 j - 1 个已经拍好即 f[i][j-1] + 1 ;

3:替换操作: 替换操作之前即前  i-1 个和前 j-1个已经排好


                       这时候又要分成两种情况:1.a[i]和b[j] 相同 则f[i-1][j-1]


                                                                   2.a[i]和b[j] 不相同则 f[i-1][j-1] + 1  

下面是一些细节问题,不想一一再过了:

#include<iostream>
#include<cstring>
#include<algorithm>
 
using namespace std ;
const int N = 1010 ,INF = 1e9 ;;
int f[N][N] ;
char a[N] , b[N] ;
int n,m ;
int main(){
  cin >> n >> a+1 ;
  cin >> m >> b+1 ;
 
  for(int i = 1 ;i <= n ; i++ ) f[i][0] = i ;//第二个字符串长度为0 即将第一个字符串全部删除 
  for(int i = 1 ;i <= m ; i ++) f[0][i] = i ;//第一个字符串长度为0 即全部插入和第二个字符串删除的 
  for(int i = 1 ; i<= n ; i ++){//遍历第一个字符串, 
    for(int j = 1 ; j <= m ; j ++){//遍历第二个字符串,当两个字符串出现一样的时候就可以进行特殊处理 
      f[i][j] =  min(f[i-1][j]+1,f[i][j-1] + 1) ;
      if(a[i]==b[j]) f[i][j] =  min(f[i-1][j-1] , f[i][j]) ;
      else f[i][j] = min(f[i-1][j-1] + 1 , f[i][j]);
    }
  }
  cout << f[n][m] << endl ;
  return 0 ;
}  

目录
相关文章
|
存储 算法 BI
【算法导论】动态规划之最长公共子序列
        子序列:一个给定序列的子序列就是该给定序列去掉零个或者多个元素后的序列。例如:Z={B,C,D,B}是X={A,B,C,B,D,A,B}的一个子序列。
1345 0
【动态规划刷题 13】最长递增子序列&& 摆动序列
【动态规划刷题 13】最长递增子序列&& 摆动序列
|
5月前
acwing 897 最长公共子序列
acwing 897 最长公共子序列
36 0
acwing 897 最长公共子序列
|
5月前
acwing 896 最长上升子序列II
acwing 896 最长上升子序列II
43 2
|
人工智能 算法
Acwing 896. 最长上升子序列 II
Acwing 896. 最长上升子序列 II
105 0
|
5月前
acwing 895 最长上升子序列1
acwing 895 最长上升子序列1
46 3
|
人工智能
线性DP——AcWing 898. 数字三角形、AcWing 895. 最长上升子序列
线性DP——AcWing 898. 数字三角形、AcWing 895. 最长上升子序列
116 0
|
算法
动态规划法——最长公共子序列问题
       这个题当初始终看不下去的原因就是当初误解了什么叫最长公共子序列,还一度以为这个题有问题,其实如果明白了什么叫最长公共子序列,也就解决了一半的问题。   什么是最长公共子序列?      什么是最长公共子序列呢?举个简单的例子吧,一个数列S,若分别是两个或多个已知序列的子序列,且是所有符合条件序列中最长的,则S称为已知序列的最长公共子序列。
1246 0