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


    给你两个单词 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];
        }
    }
    
  • 相关阅读:
    十七:CSS之CSS继承和层叠
    十六:CSS之CSS选择器之后代选择器、伪类选择器
    十五:CSS之CSS选择器之群组选择器、全局选择器
    十四:CSS之CSS选择器之标签选择器、类选择器、ID选择器
    Android开发技巧——ViewPager加View情况封装PagerAdapter的实现类
    JAVA知识笔记
    机器学习笔记
    设计模式学习
    Android小知识汇总
    判断GPS是否开启&转到设置GPS界面
  • 原文地址:https://www.cnblogs.com/lippon/p/14117631.html
Copyright © 2020-2023  润新知