zoukankan      html  css  js  c++  java
  • 编辑距离

    题面

    给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。

    你可以对一个单词进行如下三种操作:

    插入一个字符
    删除一个字符
    替换一个字符

    输入: word1 = "horse", word2 = "ros"
    输出: 3
    解释:
    horse -> rorse (将 'h' 替换为 'r')
    rorse -> rose (删除 'r')
    rose -> ros (删除 'e')

    思路:

    f[i][j]第一个单词的前i个字母,第二个单词的前j个字母匹配的最小操作数

    f[i][j] = min(f[i][j], f[i - 1][j - 1] + 1);//更改
    f[i][j] = min(f[i][j], f[i - 1][j] + 1);//添加
    f[i][j] = min(f[i][j], f[i][j - 1] + 1);
    f[i][j] = min(f[i][j], f[i][j - 1] + 1);//删除
    //删除第一个单词的字母,与在第二个单词添加一个单词等价

    代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=1000;
     4 char w1[N],w2[N];
     5 int l1,l2,f[N][N];
     6 int main() {
     7     scanf("%d", &w1);
     8     scanf("%d", &w2);
     9     l1 = strlen(w1);
    10     l2 = strlen(w2);
    11     memset(f, 0x3f3f3f3f, sizeof(f));
    12     f[0][0] = 0;
    13     for (int i = 0; i <= l1; i++) {
    14         f[i][0] = i;
    15     }
    16     for (int i = 0; i <= l2; i++) {
    17         f[0][i] = i;
    18     }
    19     for (int i = 1; i <= l1; i++) {
    20         for (int j = 1; j <= l2; j++) {
    21             if (w1[i] == w2[j]) f[i][j] = f[i - 1][j - 1];
    22             else {
    23                 f[i][j] = min(f[i][j], f[i - 1][j - 1] + 1);//更改
    24                 f[i][j] = min(f[i][j], f[i - 1][j] + 1);//添加
    25                 f[i][j] = min(f[i][j], f[i][j - 1] + 1);
    26                 f[i][j] = min(f[i][j], f[i][j - 1] + 1);//删除
    27                 //删除第一个单词的字母,与在第二个人单词添加一个单词等价
    28             }
    29         }
    30     }
    31     printf("%d
    ", f[l1][l2]);
    32 }
    View Code
  • 相关阅读:
    MySQL 连接 触发器 函数 视图 存储过程
    Django的ORM2
    nmp安装vuejs
    Docker 技术入门与实践(第3版)笔记
    docker官方 入门
    centos 各目录介绍
    阿里云es 安装docker
    linux命令
    centos 7 mini 安装青岛OJ
    leetcode_304. 二维区域和检索
  • 原文地址:https://www.cnblogs.com/Accpted/p/11185903.html
Copyright © 2011-2022 走看看