题目:
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
思路:
动态规划,dp(i,j)指(i-1)和(j-1)位置需要多少次变换才能相等,若word1[i-1]==word2[j-1],那么dp(i,j)=dp(i-1,j-1),否则的话,则是从dp(i-1,j-1),dp(i,j-1),dp(i-1,j)中选择一个最小值,然后再加1.
package dp; public class EditDistance { public int minDistance(String word1, String word2) { int m = word1.length(); int n = word2.length(); int[][] dp = new int[m + 1][n + 1]; for (int i = 0 ;i <= m ; ++i) dp[i][0] = i; for (int i = 0; i <= n; ++i) dp[0][i] = i; for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { if (word1.charAt(i - 1) == word2.charAt(j - 1)) { dp[i][j] = dp[i - 1][j - 1]; } else { dp[i][j] = 1 + Math.min(Math.min(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]); } } } return dp[m][n]; } public static void main(String[] args) { // TODO Auto-generated method stub EditDistance e = new EditDistance(); System.out.println(e.minDistance("a", "b")); System.out.println(e.minDistance("abc", "bc")); System.out.println(e.minDistance("abc", "def")); System.out.println(e.minDistance("abcdefg", "bcdefgh")); System.out.println(e.minDistance("abc", "cba")); } }