题目
给定2个字符串,计算一个字符串经过最少的变换转换为另外一个字符串。
变换可以是3种:
插入一个字符
删除一个字符
更改一个字符
例如:
str = “abc”
str2 = “bc”
str删除前边的一个字符则变成str2,或者str2增加一个字符则变成str,所以编辑距离为1
分析思路
动态规划思想
字符串A,字符串B编辑距离和
字符串A去掉最后1个字符,字符串B去掉最后1个字符
字符串A,字符串B去掉最后1个字符
字符串A去掉最后1个字符,字符串B
的相似度有一定的关系,可以得到迭代公式,进一步进行计算即可
代码
package org.example.distance;
/**
* 最短编辑距离
*/
public class EditDistance {
//初始化数据
public static int editDistance(char[] strA,char[] strB){
int[][] dp = new int[strA.length+1][strB.length+1];
//初始化
for (int i = 0; i < strA.length+1 ; i++) {
dp[i][0]=i;
}
//初始化
for (int j = 0; j < strB.length+1 ; j++) {
dp[0][j]=j;
}
//计算最短编辑距离
//从矩阵的左下角开始计算最小编辑距离
for (int i = 1; i < strA.length+1 ; i++) {
for (int j = 1; j < strB.length+1; j++) {
//如果末尾字符一样
if(strA[i-1]==strB[j-1]){
dp[i][j] = Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1])+1);
}else {
dp[i][j] = Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1]))+1;
}
}
}
//返回编辑距离
return dp[strA.length][strB.length];
}
public static void main(String[] args) {
char[] strA = "abcd".toCharArray();
char[] strB = "ab".toCharArray();
System.out.println(editDistance(strA,strB));
}
}