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:
- Insert a character
- Delete a character
- Replace a character
Given word1 = "mart"
and word2 = "karma"
, return 3
.
动态规划,用一个二维int数组记录word1中前i个字符到word2中前j个字符的edit distance:
如果word1中的第i-1个字符和word2中第j-1个字符相等,说明这个edit distance和word1前i-1个字符到word2前j-1个字符的edit distance相等
如果这两个字符不相等,这时有三种选择:
1. 修改:把word1最后一个字符改为word2最后一个字符,edit distance为dp[i - 1][j - 1] + 1
2. word1增加一个字符:在word1前i-1个字符中加入一个字符,edit distance为dp[i - 1][j] + 1
3. word2增加一个字符:在word2前j-1个字符中加入一个字符,edit distance为dp[i][j - 1] + 1
选取其中最小的一个作为dp[i][j]
public class Solution { /** * @param word1 & word2: Two string. * @return: The minimum number of steps. */ public int minDistance(String word1, String word2) { // write your code here if(word1 == null || word1.length() == 0) return word2.length(); if(word2 == null || word2.length() == 0) return word1.length(); 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++){ char c1 = word1.charAt(i - 1); for(int j = 1; j <= n; j++){ char c2 = word2.charAt(j - 1); if(c1 == c2){ dp[i][j] = dp[i - 1][j - 1]; } else{ dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1])) + 1; } } } return dp[m][n]; } }
时间: 2024-10-23 02:55:16