【刷题之路】字符串的编辑距离

2023-11-07

对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。

给定两个字符串AB,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。

经典动态规划问题,简历一个二维数组来解决问题

首先确定初始状态,先建立一个m+1*n+1的二维数组,其中行数是B,列数是A,数组的左上角为A,B都为空字符串时,显然操作数为0,对于第一行,显然是当B为空时,不断扩大A时所需要的操作,显然需要不断删除A中元素来达到,所以第一行里的操作数为i*c1,同理对于第一列,A为空不断扩大B,则需要不断将B中字符插入A中,所以第一列的操作数为i*c0。初始状态设置完毕

对于数组中某一个res[i][j]来说,可能的状态一共有四种,

1、对于当前A来说,删除一个字符,然后将删除后的字符字符串再去变为当前B,而删去一个字符之后,变为B的最小操作数为res[i][j-1],即res[i][j]=res[i][j-1]+c1;

2、对于当前A来说,插入一个字符,然后将插入后的字符串再去变为当前B,插入一个字符后最小操作数,为res[i-1][j](注:这里需要理解,前两种操作的本质实际上是字符串对齐,也就是说让这之前的字符串全部相等,然后再去考虑后面的,例如这个插入操作,并不是res[i][j+1],因为我是要将A变为B,所以当插入一个字符后,应该将当前的A与上一个B的最小操作数返回,因为假如需要插入的话,必然是A短,加入了一个字符后应该基于没加入字符时的状态的B比较,也就是res[i-1][j])即res[i][j]=res[i-1][j]+c0;

3、对于当前A来说,替换一个字符,然后将替换后的字符串再去变为B,即res[i][j]=res[i-1][j-1]+c2,

4、对与当前A来说,如果与当前B字符相同,可以考虑不变化,即res[i][j]=res[i-1][j-1](3与4实际上是二选一,因为我们需要的是最小的操作数)

取四种操作数中最小的作为当前位置的值,代码如下

class MinCost {
public:
    int findMinCost(string A, int n, string B, int m, int c0, int c1, int c2) {
        // write code here
        vector<int> sub(n+1);
        vector<vector<int>> res(m+1,sub);
        int i,j,temp1,temp2,temp3;
        for(i=0;i<=n;i++){
            res[0][i]=i*c1;
        }
        for(i=0;i<=m;i++){
            res[i][0]=i*c0;
        }
        for(i=1;i<=m;i++){
            for(j=1;j<=n;j++){
                temp1=res[i][j-1]+c1;
                temp2=res[i-1][j]+c0;
                if(A[j-1]==B[i-1]) temp3=res[i-1][j-1];
                else temp3=res[i-1][j-1]+min(c2,c0+c1);
                res[i][j]=min(temp1,min(temp2,temp3));  
            }
        }
        return res[m][n];
    }
};


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【刷题之路】字符串的编辑距离 的相关文章

随机推荐

  • java操作seaweedfs

    前置条件是seaweedfs服务已成功启动 具体部署可参考我上篇文章SeaweedFS部署及使用指南 首先导入pom依赖
  • Python Scrapy网络爬虫框架从入门到实战

    Python Scrapy是一个强大的网络爬虫框架 它提供了丰富的功能和灵活的扩展性 使得爬取网页数据变得简单高效 本文将介绍Scrapy框架的基本概念 用法和实际案例 帮助你快速上手和应用Scrapy进行数据抓取 Scrapy是一个基于P
  • SpringMVC源码总结 ViewResolver介绍

    首先我们先看看ModelAndView中重要的View接口 View接口 Java代码 String getContentType Render the view given the specified model p The first
  • QT翻金币小游戏实现(三)

    4 创建翻金币场景 4 1创建翻金币界面 设计好主场景以及选择关卡界面以后 就来到了最重要的一环 翻金币 首先还是创建一个cpp文件命名为PlayScene 第一步在选择关卡中声明PlayScene pScene NULL 方便后面使用 点
  • 模拟点击事件

    一 通过代码模拟用户对按钮的点击 模拟按钮的点击 方法一 使用btn click模拟用户的点击 btn click 方法二 两秒之后自动松开按钮 btn animateClick 2000 区别是方法一没有什么动画 界面展示 方法二有时间效
  • C#笔记9——基于TableLayoutPanel的多分屏、全屏程序

    C 笔记9 基于TableLayoutPanel的多分屏 全屏程序 最近由于工作需要 需要设置一个多分屏窗口以便于多分屏播放视频 思考了一下 大致思路如下 用TableLayoutPanel来划分多个区域 在每个区域中都放入一个Pictur
  • windows下composer切换php不同版本使用

    D object cms gt D sf phpStudy 64 phpstudy pro Extensions php php7 3 4nts php exe D sf phpStudy 64 phpstudy pro Extension
  • A²B汽车音频总线介绍

    A B使远程I S TDM成为可能 I S是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准 该总线专责于设备之间的数据传输 广泛应用于各种多媒体系统 I C是两线式串行总线 用于连接微控制器及其外围设备 简单来说就是I C传
  • CANopen协议 学习笔记

    大纲 前沿 以问题为导向学习是最高效的 本文主要讲述在学习Canopen协议中的一些疑惑点 分享一些学习心得 不讲协议本身的内容 1 主机和从机的概念 2 PDO和SDO的区别是什么 3 OD存在的意义是什么 4 心跳检测的意义 0x00
  • LeetCode 刷题 28

    这一题 第一反应是 用map 或者栈 但是仔细想想后觉得太麻烦了 于是选用了双指针的方法 class Solution public int strStr string haystack string needle int hay 0 in
  • Jmeter测试linux服务器性能,报错:SampleSaveConfiguration.setFormatter(Ljava/text/DateFormat;)V

    1 出现问题 在执行命令 jmeter n t test jmx l log jtl 时 报标题错误 2 原因 Jmeter的版本太高了 不支持其中一个方法了 jmeter版本太高 setFormatter方法在3 1版本后不支持 但是插件
  • python输出个数、给定一个n*n的矩阵m_简述Numpy

    numpy的数组对象ndarray np array 生成一个ndarray数组 np array 输出成 形式 元素由空格分割 轴 axis 保存数据的维度 秩 rank 轴的数量 ndarray对象的属性 属性 说明 ndim 秩 即轴
  • MAC之常用终端命令、隐藏/打开文件、查看磁盘占用情况、系统盘占用存储过大

    1 从普通用户lambo切换到root用户 sudo i 2 从root用户切换到普通用户 exit 3 普通用户之间的切换 sudo 普通用户名 4 sudo su 直接进入sh 3 2 返回到之前的用户 exit 5 回到home目录
  • 使用python进行图片的文字识别

    使用python进行图片的文字识别 文章目录 使用python进行图片的文字识别 安装 Tesseract OCR 安装过程 配置系统的环境变量 安装python的第三方库 Pytesseract库 Pillow库 运行个demo 安装 T
  • MySQL面试八股文(2022最新整理)

    事务的四大特性 事务特性ACID 原子性 Atomicity 一致性 Consistency 隔离性 Isolation 持久性 Durability 原子性是指事务包含的所有操作要么全部成功 要么全部失败回滚 一致性是指一个事务执行之前和
  • 关于深度学习中batch_size参数设置

    关于深度学习中参数的设置 batch size 常用设置 batch的size设置的不能太大也不能太小 因此实际工程中最常用的就是mini batch 一般size设置为几十或者几百 对于二阶优化算法 减小batch换来的收敛速度提升远不如
  • DBeaver数据库连接工具的简单操作

    DBeaver数据库连接工具的简单操作 DBeaver数据库链接工具使用简介 数据链接配置 DBeaver常用功能 功能快捷键 DBeaver数据库链接工具使用简介 官方下载地址链接 https dbeaver io download DB
  • MyBatis-Plus 使用教程

    MyBatis Plus 使用教程 增删改查详细介绍 MyBatis Plus opens new window 简称 MP 是一个 MyBatis opens new window 的增强工具 在 MyBatis 的基础上只做增强不做改变
  • [Python实战]采集电商平台商品数据进行可视化分析

    目录 前言 环境使用 模块使用 第三方模块安装 基本流程思路 代码展示 获取数据 扩展知识 数据可视化 前言 嗨喽 大家好呀 这里是小曼呐 环境使用 python3 8 解释器 pycham 解释器 模块使用 第三方模块 需要安装 requ
  • 【刷题之路】字符串的编辑距离

    对于两个字符串A和B 我们需要进行插入 删除和修改操作将A串变为B串 定义c0 c1 c2分别为三种操作的代价 请设计一个高效算法 求出将A串变为B串所需要的最少代价 给定两个字符串A和B 及它们的长度和三种操作代价 请返回将A串变为B串所