标签:
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
[Solution]
用table[i][j]表示从word1[i]变为word2[j]所需要的最少步骤。
1) 匹配:若word1[i]=word2[j] , 则只需把word1[0...i-1]变为word2[0...j-1]即可. ==> table[i][j] = table[i-1][j-1].
2) 替换:把word1[i]替换word2[j]是从word1到word2的最小改动,则 先把word1[0...i-1]以最小代价变为word2[0...j-1],再替换. ==> table[i][j] = table[i-1][j-1] + 1.
3) 插入:若在word1[i]插入某字符是word1到word2[的最小改动,则先把word1[0...i]以最小代价变为word2[0...j-1],在此基础上加上word2[j], ==> table[i][j] = table[i][j-1] + 1.
4) 删除:若删除word1[i]是word1到word2的最小改动,则先把word1[0...i-1]以最小代价变为word2[0...j], 再删除word1[j]即可,table[i][j] = table[i-1][j] + 1.
1 int minDistance(string word1, string word2) 2 { 3 int i, j, ndelete, ninsert, nreplace, min_step; 4 int m = word1.size(), n = word2.size(); 5 if (m == 0 || n == 0) 6 return (m == 0) ? n : m; 7 8 int **table = new int* [m + 1]; // table[i][j] means change word1[i] to word2[j]; 9 for (i = 0; i <= m; i++) 10 table[i] = new int [n + 1]; 11 12 for (i = 0; i <= m; i++) 13 table[i][0] = i; 14 for (j = 0; j <= n; j++) 15 table[0][j] = j; 16 17 for (i = 1; i <= m; i++) 18 { 19 for (j = 1; j <= n; j++) 20 { 21 ndelete = table[i - 1][j] + 1; 22 ninsert = table[i][j - 1] + 1; 23 if (word1[i - 1] == word2[j - 1]) 24 nreplace = table[i - 1][j - 1]; 25 else 26 nreplace = table[i - 1][j - 1] + 1; 27 table[i][j] = min(nreplace, min(ndelete, ninsert)); 28 } 29 } 30 min_step = table[m][n]; 31 32 for (i = 0; i <= m; i++) 33 delete[] table[i]; 34 delete[] table; 35 36 return min_step; 37 }
标签:
原文地址:http://www.cnblogs.com/ym65536/p/4301825.html