• 基于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());
                 }
             }
     
             /// 
             /// 计算字符串的编辑距离
             /// 
             /// 
             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];
             }
         }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    image.png
    image.png

  • 相关阅读:
    位运算 |(按位或) &(按位与) ^(按位异或)
    全同态加密-丁津泰:学习
    MybatisPlus中Enum的使用(MybatisEnumTypeHandler)及遇到的问题
    全国见!飞桨星河社区五周年,邀你共赴大模型盛宴!
    【uniapp】解决h5在ios safari浏览器tabBar抖动问题
    进程控制详解
    鸿蒙应用服务开发【华为支付服务】客户端
    第五十二章 开发自定义标签 - Using csr %CSP.AbstractAtom Write Methods
    wireguard协议分析
    K8S环境搭建
  • 原文地址:https://blog.csdn.net/s1t16/article/details/134503319