概念
字符串的编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提出。是指利用字符操作,把字符串A转换成字符串B所需要的最少操作数。其中,字符操作包括:
- 删除一个字符 a) Insert a character
- 插入一个字符 b) Delete a character
- 修改一个字符 c) Replace a character
例如对于字符串"if"和"iff",可以通过插入一个'f'或者删除一个'f'来达到目的。
一般来说,两个字符串的编辑距离越小,则它们越相似。如果两个字符串相等,则它们的编辑距离(为了方便,本文后续出现的“距离”,如果没有特别说明,则默认为“编辑距离”)为0(不需要任何操作)。不难分析出,两个字符串的编辑距离肯定不超过它们的最大长度(可以通过先把短串的每一位都修改成长串对应位置的字符,然后插入长串中的剩下字符)。
问题描述:
给定两个字符串A和B,求字符串A至少经过多少步字符操作变成字符串B。
代码
public static int getSimlerDistance(String a,String b){
int n = a.length();
int m = b.length();
int dp[][] = new int[m+1][n+1];
if(a.length()==0 && b.length()!=0){
return b.length();
}else if(a.length()!=0&& a.length()==0){
return a.length();
}else if(a.length()==0&& b.length()==0){
return 0;
}else{
//初始化
for (int i = 0; i <=m;i++) {
dp[i][0] = i;
}
//初始化
for (int j = 0; j <=n;j++){
dp[0][j] =j;
}
int temp=0;
for (int i = 1; i <m;i++){
for (int j = 1; j <n;j++){
if(a.charAt(i-1) ==b.charAt(j-1)){
temp=1;
//dp[i][j] = dp[i-1][j-1];
}else{
temp=0;
}
dp[i][j] = Math.min(Math.min(dp[i][j-1]+1,dp[i-1][j]+1),dp[i-1][j-1]+temp);
}
}
return dp[m][n];
}
}