当前位置: 首页 > news >正文

LeetCode -- Edit Distance

题目描述:


Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)


You have the following 3 operations permitted on a word:


a) Insert a character
b) Delete a character
c) Replace a character


就是求从单词1(word1)变化到单词2(word2)的最小变化次数,每次变化只能:添加、删除或更新1个字符。
本题是一道典型的DP题,递推公式:
假设dp[i,j]表示word1前i-1个字符到word2的前j-1个字符最小变化次数。
首先对dp做初始化,当word1为空串时,dp[i,0]为i(情况只可能是添加i个字符),其中i∈[0,n]。同理,dp[0,i]的初始化也可以看作是word2为空串时,从word1变到空串的情况数同样为i(即只可能是移除i个字符)。


I.当word1[i]与word2[j]相等时,无需更新次数,即dp[i+1,j+1] = dp[i,j]


II.当word1[i]与word2[j]不等时,当前的比较的“上一次比较情况”可以分3种可能:
1. word1[i-1]与word2[j-1]比较
2. word1[i]与word2[j-1]
3. word[i-1]与word2[j]。
只需要从存放这3种情况中比较结果的dp数组中判断哪种情况最小即可。
即,
dp[i+1,j+1]= 最小值(dp[i,j+1], dp[i+1,j], dp[i,j])




实现代码:




public class Solution {
    public int MinDistance(string word1, string word2) {
        var dp = new int [word1.Length+1, word2.Length+1];
	
    	for(var i = 0;i < word1.Length + 1; i++){
    		dp[i,0] = i;
    	}
    	for(var i = 0;i < word2.Length + 1; i++){
    		dp[0,i] = i;
    	}
    	
    	for(var i = 0; i < word1.Length; i++){
    		for(var j = 0;j < word2.Length; j++){
    			if(word1[i] == word2[j]){
    				dp[i+1,j+1] = dp[i,j];
    			}
    			else{
    				var min = Math.Min(Math.Min(dp[i,j], dp[i,j+1]), dp[i+1,j]);
    				dp[i+1,j+1] = min + 1;
    			}
    		}
    	}
    	
    	return dp[word1.Length, word2.Length];
    }
}


相关文章:

  • Leetcode -- Find Minimum in Rotated Sorted Array
  • SQL2005CLR函数扩展-树的结构
  • LeetCode -- Longest Consecutive Sequence
  • Flex与.NET互操作(八):使用FluorineFx网关实现远程访问
  • LeetCode -- Missing Number
  • [Windows编程] Windows 7 对多核的支持
  • LeetCode -- Palindrome Linked List
  • SSH客户端设置环境变量
  • LeetCode -- Search for a Range
  • 老子生平
  • LeetCode -- Simplify Path
  • 老子著述
  • LeetCode -- Single Number
  • LeetCode -- Find Peak Element
  • 老子思想
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Android 控件背景颜色处理
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • in typeof instanceof ===这些运算符有什么作用
  • javascript面向对象之创建对象
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Linux gpio口使用方法
  • OSS Web直传 (文件图片)
  • python_bomb----数据类型总结
  • vue2.0项目引入element-ui
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 编写符合Python风格的对象
  • 成为一名优秀的Developer的书单
  • 从0到1:PostCSS 插件开发最佳实践
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​ArcGIS Pro 如何批量删除字段
  • ​业务双活的数据切换思路设计(下)
  • #《AI中文版》V3 第 1 章 概述
  • #mysql 8.0 踩坑日记
  • #pragam once 和 #ifndef 预编译头
  • #pragma 指令
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (175)FPGA门控时钟技术
  • (42)STM32——LCD显示屏实验笔记
  • (多级缓存)多级缓存
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)Sql Server 保留几位小数的两种做法
  • (转)程序员疫苗:代码注入
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .Net IOC框架入门之一 Unity
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET开发者必备的11款免费工具
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @PreAuthorize注解
  • @SuppressWarnings(unchecked)代码的作用