编辑距离算法以及它的C#实现

原文:https://www.cnblogs.com/shihuajie/p/5772173.html

注意,原文中有以下表述不当的地方

  1. “扫描两字符串(n*m级的),如果:str1 == str2[j]”应该改为“扫描两字符串(n*m级的),如果:str1[i]== str2[j]”.并且,这里的扫描如果放在矩阵里面实现的话,其实是i-1和j-1(因为矩阵下标为1的位置对应的实际是字符串下标为0的位置
  2. 第二个图标中,(1,2)和(2,1)这两个位置的元素其实是没有变化的,还是两个1。这里是借用了这个位置来写东西,但是会造成误导

最后附上自己的C#实现,由于是初学,代码质量不敢保证,倒是可以使用:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication1
 8 {
 9     class SString
10     {
11         private int GetMin(int a,int b,int c)
12         {
13             if (a <= b && a <= c)
14                 return a;
15             else if (b <= a && b <= c)
16                 return b;
17             else
18                 return c;
19         }
20         public int init(string s1,string s2)
21         {
22             if (s1.Length == 0)
23                 return s2.Length;
24             else if (s2.Length == 0)
25                 return s1.Length;
26             else
27             {
28                 int s1length = s1.Length;
29                 int s2length = s2.Length;
30                 int[,] martix = new int[s1length + 1, s2length + 1];
31                 for(int i=0;i<=s1length;i++)
32                 {
33                     martix[i, 0] = i;
34                 }
35                 for(int j=0;j<=s2length;j++)
36                 {
37                     martix[0, j] = j;
38                 }
39                 for(int i=1;i<s1length+1;i++)
40                     for(int j=1;j<s2length+1;j++)
41                     {
42                         int temp;
43                         if(s1[i-1]==s2[j-1])
44                             temp=0;
45                         else
46                             temp=1;
47                         martix[i, j] = GetMin(martix[i - 1, j] + 1, martix[i, j - 1] + 1, martix[i - 1, j - 1] + temp);
48                     }
49                 return martix[s1length, s2length];
50             }
51         }
52     }
53     class Program
54     {
55         static void Main(string[] args)
56         {
57             SString temp=new SString();
58            string te= Console.ReadLine();
59             string[] ans=te.Split();
60             Console.WriteLine(temp.init(ans[0], ans[1]));
61         }
62     }
63 }
原文地址:https://www.cnblogs.com/jiading/p/9732198.html