算法——最小增删改操作使得两个字符串相同

给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
leetcode

解题思路:动态规划。

  1. 首先建立状态表示数组,通过一个二维数组,表示两个字符串,在各自不同的长度下,产生匹配所需的最少操作数。
  2. 先初始化,就是当一个字符串为空,那么最小操作数就是另一个字符串的长度值,因为全部都是增加操作即可。
  3. 然后是状态转移,两个字符串所有的字符匹配组合情况。
    • 如果当前字符相同,则当前的操作数等于二者去掉当前字符,截取的前一段字符串的比较情况。而且不需要与当前状况比较取最小值,因为肯定前者更小。
    • 如果当前字符不相同,就需要比较增加和替换那个操作能获得更小的操作数了。
class Solution {
    public int minDistance(String word1, String word2) {
        int n = word1.length(), m = word2.length();

        int[][] f = new int[n + 1][m + 1];

		// 当一个字符串为空的时候,则与其可以产生匹配的操作数就是不为空的字符串的长度,全部都是增加嘛
        for(int i = 0; i < n + 1; i++) f[i][0] = i;
        for(int i = 0; i < m + 1; i++) f[0][i] = i;

        for(int i = 1; i < n + 1; i++) {
            for(int j = 1; j < m + 1; j++) {

                if(word1.charAt(i - 1) == word2.charAt(j - 1)) {
                	// 如果当前字符串相等,那么当前的最小操作数等于二者前面的匹配操作数
                    f[i][j] = f[i - 1][j - 1];
                } else {
            		// 增加或者删除操作
                	f[i][j] = Math.min(f[i - 1][j], f[i][j - 1]) + 1; 
					// 替换操作 
                    f[i][j] = Math.min(f[i - 1][j - 1] + 1, f[i][j]);
                }
            }
        }

        return f[n][m];
    }
}
原文地址:https://www.cnblogs.com/lippon/p/14117631.html