算法

34 阅读1分钟
package com.tinner;

import java.util.Arrays;

/**
 * @Classname Lenth
 * @Description Lenth
 * @Date 2020/6/10 11:05 上午
 * @Created by tinner
 */
public class Lenth {

    private static int recursion(String word1, String word2, int length1, int length2, int[][] dis) {
        if (dis[length1][length2] > -1) {
            return dis[length1][length2];
        }
        if (length1 == 0) {
            return length2;
        } else if (length2 == 0) {
            return length1;
        } else if (word1.charAt(length1 - 1) == word2.charAt(length2 - 1)) {
            // 两个字符相等的话我们就直接比较前一个字符
            int distance = recursion(word1, word2, length1 - 1, length2 - 1, dis);
            dis[length1][length2] = distance;
            return distance;
        } else {
            // 删除字符和添加字符我们达到的效果是一样的
            // 当两个字符串不相等的时候我们就删除word1的最后一个字符,计算(m-1,n)这两个字符串之间的最短编辑距离
            int deleteWord1 = recursion(word1, word2, length1 - 1, length2, dis);
            // 删除word2的最后一个字符
            int deleteWord2 = recursion(word1, word2, length1, length2 - 1, dis) + 1;
            // 替换一个word1或者word2中的任意一个字符
            int replaceWord = recursion(word1, word2, length1 - 1, length2 - 1, dis);
            int distance = Math.min(Math.min(deleteWord1, deleteWord2), replaceWord) + 1;
            dis[length1][length2] = distance + 1;
            return distance;
        }
    }

    //  动态规划解法
    public static int minDistanceWay2(String word1, String word2) {
        int lenWord1 = word1.length();
        int lenword2 = word2.length();
        // minDis[i][j]表示长度为i和长度为j的单词之间的最小编辑距离
        int[][] minDis = new int[lenWord1 + 1][lenword2 + 1];
        for (int i = 1; i <= lenWord1; i++) {
            minDis[i][0] = i;
        }

        for (int j = 1; j <= lenword2; j++) {
            minDis[0][j] = j;
        }

        for (int i = 1; i <= lenWord1; i++) {
            for (int j = 1; j <= lenword2; j++) {
                if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
                    minDis[i][j] = minDis[i - 1][j - 1];
                } else {
                    int deleteWord1 = minDis[i - 1][j] + 1;
                    int deleteWord2 = minDis[i][j - 1] + 1;
                    int replaceWord = minDis[i - 1][j - 1] + 1;
                    minDis[i][j] = Math.min(Math.min(deleteWord1, deleteWord2), replaceWord);
                }
            }
        }
        return minDis[word1.length()][word2.length()];
    }

    public static void main(String[] args) {
        System.out.println(minDistanceWay2("b", ""));
        System.out.println(minDistanceWay2("dinitrophenylhydrazine", "benzalphenylhydrazone"));
    }
}