zoukankan      html  css  js  c++  java
  • 算法——最小增删改操作使得两个字符串相同

    给你两个单词 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];
        }
    }
    
  • 相关阅读:
    luogu1525 [NOIp2011]关押罪犯 (并查集)
    luogu1084 [NOIp2012]疫情控制 (二分答案+倍增+dfs序)
    luogu1083 [NOIp2012]借教室 (二分答案+差分)
    bzoj4152 The Captain (dijkstra)
    luogu1081 [NOIp2012]开车旅行 (STL::multiset+倍增)
    suoi22 WRX知识树(dfs序)
    [HNOI2010]弹飞绵羊
    1596: [Usaco2008 Jan]电话网络
    [Tyvj Jan]青蛙跳荷叶
    [BZOJ1116] CLO
  • 原文地址:https://www.cnblogs.com/lippon/p/14117631.html
Copyright © 2011-2022 走看看