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
minDis[i][0] = i
}
for (int j = 1
minDis[0][j] = j
}
for (int i = 1
for (int j = 1
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"))
}
}