编辑距离算法以及它的C#实现
原文:https://www.cnblogs.com/shihuajie/p/5772173.html
注意,原文中有以下表述不当的地方
- “扫描两字符串(n*m级的),如果:str1 == str2[j]”应该改为“扫描两字符串(n*m级的),如果:str1[i]== str2[j]”.并且,这里的扫描如果放在矩阵里面实现的话,其实是i-1和j-1(因为矩阵下标为1的位置对应的实际是字符串下标为0的位置
- 第二个图标中,(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 }