| 123456789101112131415161718192021222324252627282930313233343536373839 | 
							- package main
 
- func minDistance(word1 string, word2 string) int {
 
- 	// A classic dp problem. Assume that dp[i][j] is the steps
 
- 	// that needs to be taken to change w1[0...i-1] into w2[0...j-1],
 
- 	// then we have dp[i][0] = i (i steps to change len i str into ""),
 
- 	// and dp[0][j] = j. If we known dp[i-1][j-1], then:
 
- 	// 1) if w1[i-1] == w2[j-1], dp[i][j] = dp[i-1][j-1];
 
- 	// 2) if not equal, w1[0...i-1]->w2[0...j-2]->(insert w2[j-1])
 
- 	//    dp[i][j] = dp[i][j-1] + 1
 
- 	// 3) or (delete w1[i-1])->w1[0...i-2]->w2[0...j-1]
 
- 	//    dp[i][j] = dp[i-1][j] + 1
 
- 	// 4) or (replace w1[i-1] with w2[j-1])->w1[0...i-2]+w2[j-1]->w2[0...j-2]+w2[j-1]
 
- 	//    dp[i][j] = dp[i-1][j-1] + 1
 
- 	m, n := len(word1), len(word2)
 
- 	dp := make([][]int, m+1)
 
- 	for i := range dp {
 
- 		dp[i] = make([]int, n+1)
 
- 		dp[i][0] = i
 
- 	}
 
- 	for i := 1; i <= n; i++ {
 
- 		dp[0][i] = i
 
- 	}
 
- 	for i := 1; i <= m; i++ {
 
- 		for j := 1; j <= n; j++ {
 
- 			if word1[i-1] == word2[j-1] {
 
- 				dp[i][j] = dp[i-1][j-1]
 
- 			} else {
 
- 				dp[i][j] = minInts(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]) + 1
 
- 			}
 
- 		}
 
- 	}
 
- 	return dp[m][n]
 
- }
 
- // func main() {
 
- // 	println(minDistance("", ""))
 
- // 	println(minDistance("horse", "ros"))
 
- // }
 
 
  |