基于C#实现字符串相似度

一、概念

对于两个字符串 A 和 B,通过基本的增删改将字符串 A 改成 B,或者将 B 改成 A,在改变的过程中我们使用的最少步骤称之为“编辑距离”。比如如下的字符串:我们通过种种操作,痉挛之后编辑距离为 3,不知道你看出来了没有?
image.png

二、解析

可能大家觉得有点复杂,不好理解,我们试着把这个大问题拆分掉,将"字符串 vs 字符串“,分解成”字符 vs 字符串“,再分解成”字符 vs 字符“。
<1> ”字符“vs”字符“
这种情况是最简单的了,比如”A“与”B“的编辑距离很显然是1。
<2> ”字符”vs"字符串"
”A“改成”AB“的编辑距离为1,“A”与“ABA”的编辑距离为2。
<3>“字符串”vs“字符串”
“ABA”和“BBA”的编辑距离为 1,仔细发现我们可以得出如下结论,”ABA“是由 23 个子序列与”BBA“字符串求的的编辑距离集合中取出的最小编辑距离,也就是说在这种情况下我们出现了重复计算的问题,我在求子序列”AB“和”BBA"的编辑距离时,我是由子序列”A“和”BBA“与”B“和”BBA“之间的编辑距离中选出一个最小值,然而序列 A 和序列 B 早之前我已经计算过了,这种重复计算的问题有点像”斐波那契”,正好满足“动态规划”中的最优子结构和重叠子问题,所以我们决定采用动态规划来解决。

三、公式

跟“最长公共子序列”一样,我们采用一个二维数组来保存字符串 X 和 Y 当前的位置的最小编辑距离。
现有两个序列 X={x1,x2,x3,…xi},Y={y1,y2,y3,…,yi},设一个 C[i,j]: 保存 Xi 与 Yj 的当前最小的 LD。
①: 当 Xi = Yi 时,则 C[i,j]=C[i-1,j-1];
②:当 Xi != Yi 时, 则 C[i,j]=Min{C[i-1,j-1],C[i-1,j],C[i,j-1]};
最终我们的 C[i,j]一直保存着最小的 LD。

四、代码

 using System;
 
 namespace ConsoleApplication2
 {
     public class Program
     {
         static int[,] martix;
 
         static string str1 = string.Empty;
 
         static string str2 = string.Empty;
 
         static void Main(string[] args)
         {
             while (true)
             {
                 str1 = Console.ReadLine();
 
                 str2 = Console.ReadLine();
 
                 martix = new int[str1.Length + 1, str2.Length + 1];
 
                 Console.WriteLine("字符串 {0} 和 {1} 的编辑距离为:{2}\n", str1, str2, LD());
             }
         }
 
         /// <summary>
         /// 计算字符串的编辑距离
         /// </summary>
         /// <returns></returns>
         public static int LD()
         {
             //初始化边界值(忽略计算时的边界情况)
             for (int i = 0; i <= str1.Length; i++)
             {
                 martix[i, 0] = i;
             }
 
             for (int j = 0; j <= str2.Length; j++)
             {
                 martix[0, j] = j;
             }
 
             //矩阵的 X 坐标
             for (int i = 1; i <= str1.Length; i++)
             {
                 //矩阵的 Y 坐标
                 for (int j = 1; j <= str2.Length; j++)
                 {
                     //相等情况
                     if (str1[i - 1] == str2[j - 1])
                     {
                         martix[i, j] = martix[i - 1, j - 1];
                     }
                     else
                     {
                         //取“左前方”,“上方”,“左方“的最小值
                         var temp1 = Math.Min(martix[i - 1, j], martix[i, j - 1]);
 
                         //获取最小值
                         var min = Math.Min(temp1, martix[i - 1, j - 1]);
 
                         martix[i, j] = min + 1;
                     }
                 }
             }
 
             //返回字符串的编辑距离
             return martix[str1.Length, str2.Length];
         }
     }
 }

image.png
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/166900.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虹科分享 | PEAK版本升级,看看有没有你关注的新功能?

号外号外&#xff01;近期PEAK进行了重要的版本升级&#xff0c;这次升级带来了许多令人兴奋的功能优化&#xff0c;助力您的工作流程更加便捷高效。为了帮助您更好地了解PEAK新版本&#xff0c;我们提供了详细的说明和指导&#xff0c;快来看看有没有你关注的新功能&#xff1…

如何为视频添加旁白,有哪些操作技巧?

简而言之&#xff0c;画外音是视频的旁白&#xff0c;在教程视频中添加旁白可以使视频更加有趣&#xff0c;并向观看者传达更多的信息。 如果您是视频制作人&#xff0c;想要为视频添加旁白&#xff0c;可阅读以下文章&#xff0c;可以帮助您更好地进行配音。 制作配音的技巧…

ubuntu20.04蓝牙连接airpods

ubuntu20.04蓝牙连接airpods 解禁蓝牙安装blueman设置模式连接上没有声音的问题 解禁蓝牙 sudo rmmod btusb sleep 1 sudo modprobe btusb sudo /etc/init.d/bluetooth restart安装blueman sudo apt install blueman sudo apt-get install pulseaudio-module-bluetooth sudo …

球幕投影有哪些常见的物理表现形式?

近年来&#xff0c;投影技术不断发展完善&#xff0c;给内容的表达方式带来了突破&#xff0c;使其展示形式不再局限于平面&#xff0c;即使在弧面、球面等异形幕墙上&#xff0c;也能呈现出令人惊叹的视觉画面。其中球幕投影备受关注&#xff0c;它以半球形屏幕将图像投影到球…

pytest

pytest test_one.py pytest的执行

十倍增量的海外客户开发新方式来了!外贸企业可直接照做

外贸和B2大C型&#xff08;汽车、房产、保险、教育等&#xff09;企业出海过程中&#xff0c;除了常见的数字营销&#xff08;投放&#xff09;、平台营销、活动营销&#xff08;线下展会&#xff09;和内容营销&#xff0c;还有一个批量化可快速复制起量的营销方式&#xff1a…

大厂秋招真题【单调栈】Bilibili2021秋招-大鱼吃小鱼

文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出说明 示例二输入输出说明 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 小明最近喜欢上了俄罗斯套娃、大鱼吃小鱼这些大的包住小的类型的游戏。 于…

磁钢的居里温度和工作温度

你知道吗&#xff0c;磁体在超过一定温度时会永久的失磁&#xff0c;不同的磁体能够承受的最大工作温度是不同的&#xff0c;那么与温度相关的指标有哪些&#xff1f;如何根据工作温度来选择合适的磁钢&#xff1f;今天我们就来解答一下这些问题。 居里温度 说到温度与磁性关…

Python武器库开发-flask篇之error404(二十七)

flask篇之error404(二十七) 首先&#xff0c;我们先进入模板的界面创建一个404的html页面 cd templates vim 404.html404.html的内容如下&#xff1a; <h1>error!!!</h1>在 Flask 应用程序中&#xff0c;当用户访问一个不存在的页面的时候&#xff0c;会出现 4…

LeetCode【32】最长的有效括号

题目&#xff1a; 思路&#xff1a; 括号字符串依次入栈&#xff0c;删除匹配的成对括号。最后栈中留下的都是无法匹配的断点。这些断点的差值减一就是断点间有效括号串的长度&#xff0c;取这些长度的最大值即可。 例如括号字符串 “)()((())(”&#xff0c;最后留在栈中的…

2023初中生古诗文大会复赛12月2日举行,来做做全真在线模拟题吧

2023年11月19日日&#xff0c;上海市古诗文大会主办方通过官微发布了2023上海中学生古诗文大会&#xff08;初中组&#xff09;复选将于12月2日举行的通知&#xff0c;就初中生古诗文大会复赛&#xff08;复选&#xff09;的相关安排做了说明&#xff0c;六分成长已经为您把通知…

ASUS华硕ROG幻13笔记本电脑GV301QE原厂Windows10系统

链接&#xff1a;https://pan.baidu.com/s/1aPW0ctRXRNAhE75mzVPdTg?pwdds78 提取码&#xff1a;ds78 华硕玩家国度幻13笔记本电脑锐龙版Ryzen 7 5800HS,显卡3050 3050Ti,3060,3060Ti,3070,3070Ti 原厂W10系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办…

横向扩展统一存储备份解决方案的特点与优势

Infortrend 使企业能够实现高效和可靠的数据备份&#xff0c;确保业务不间断的运行&#xff0c;保护有价值的业务信息。用户可以依靠我们的存储解决方案实现恢复时间目标&#xff08;RTO&#xff09;和恢复点目标&#xff08;RPO&#xff09;&#xff0c;用于广泛的备份应用场景…

6.10二叉树的所有路径(LC257-E,不太会)

算法&#xff1a; 前序遍历&#xff1a; 因为要让父节点指向孩子节点&#xff0c;才能输出路径。 递归与回溯相辅相成&#xff0c;只要有递归&#xff0c;就一定有回溯。 举个例子理解一下&#xff1a; 中&#xff1a;先push入1 左&#xff1a;再Push入2 右&#xff1a;再…

MES管理系统与ERP系统的实施顺序与决策

在现今的数字化时代&#xff0c;制造企业纷纷寻求通过先进的系统来提升运营效率。其中&#xff0c;ERP管理系统与MES管理系统被誉为是数字化转型的两大利器。然而&#xff0c;在推进这两个系统时&#xff0c;企业常常面临一个关键问题&#xff1a;究竟应该先实施哪一个系统&…

BetterDisplay Pro v2.0.11(显示器颜色校准软件)

BetterDisplay Pro是一款为Mac电脑设计的屏幕亮度调节软件&#xff0c;旨在提高显示器的色彩和亮度表现。它可以根据用户的需求和显示器的特性&#xff0c;自动调整显示器的亮度、色温、对比度等参数&#xff0c;以获得更加真实、舒适的视觉效果。 这款软件拥有智能调节功能&a…

基于C#实现最长公共子序列

一、作用 最长公共子序列的问题常用于解决字符串的相似度&#xff0c;是一个非常实用的算法&#xff0c;作为码农&#xff0c;此算法是我们的必备基本功。 二、概念 举个例子&#xff0c;cnblogs 这个字符串中子序列有多少个呢&#xff1f;很显然有 27 个&#xff0c;比如其…

微创机器人:CRM撬动售后服务数字化升级

一方面&#xff0c;我国医疗器械行业起步较晚&#xff0c;更注重产品的销售和业务的拓展&#xff0c;企业售后服务整体比较滞后。 另一方面&#xff0c;医疗器械售后服务环节数字化程度不足&#xff0c;一些企业仍通过传统的线下手段管理售后服务&#xff0c;进行数字化尝试的…

element UI表格中设置文字提示(tooltip)或弹出框(popover)时候注意的地方

在表格中自定义内容的时候需要使用标签&#xff0c;否则无法正常显示 文档中有两种写法&#xff1a;1、使用 slot“reference” 的具名插槽&#xff0c;2、使用自定义指令v-popover指向 Popover 的索引ref。 使用tooltip 时用具名 slot 分发content&#xff0c;替代tooltip中…

SIMULIA-Simpack 2022x新功能介绍

通用功能 增加库伦摩擦类型 力元95 Coulomb Friction增加了3种新的摩擦方向类型用于模拟平面、圆柱和球面摩擦。 针对平移和旋转摩擦改进了滑动到粘着过渡阶段的检测&#xff0c;增加一个参数定义两种不同的滑移-粘滞过渡模式&#xff0c;即“Unloaded stick stiffness”和“…
最新文章