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


    给你两个单词 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];
        }
    }
    
  • 相关阅读:
    Windows10远程桌面连接提示:出现身份验证错误,要求的函数不受支持
    mybatis 中 if-test 判断大坑
    hutool的DateUtil工具类
    SpringBoot启动过程
    数据库事务的隔离级别
    EasyUI管理后台模板(附源码)
    springmvc中自定义拦截器以及拦截器的执行过程
    文件上传(MultipartFile)
    文件下载(使用springmvc框架中ResponseEntity对象)
    json格式实现数据传输
  • 原文地址:https://www.cnblogs.com/lippon/p/14117631.html
Copyright © 2020-2023  润新知