两个字符串的距离其实就是两个字符串之间的编辑距离呗。递推公式如下:
用动态规划思想来实现。
package 动态规划;
import java.util.Scanner;
public class 字符串相似度_动态规划 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
String str1,str2;
while(cin.hasNext()){
str1 = cin.nextLine();
str2 = cin.nextLine();
int n1 = str1.length();
int n2 = str2.length();
int[][] d = new int[n1+1][n2+1];
for(int i=0;i<n1+1;i++){
for(int j=0;j<n2+1;j++){
if(j==0)
d[i][j] = i;
if(i==0)
d[i][j] = j;
}
}
System.out.println(bottom_up_sim(str1,str2,d));
}
}
private static int bottom_up_sim(String str1, String str2, int[][] d) {
// TODO Auto-generated method stub
int n1 = str1.length();
int n2 = str2.length();
int i=1,j=1;
for(i=1;i<=n1;i++){
char c1 = str1.charAt(i-1);
for(j=1;j<=n2;j++){
char c2 = str2.charAt(j-1);
if(c1==c2){
d[i][j] = d[i-1][j-1];
}else{
d[i][j] = min(d[i-1][j-1],d[i-1][j],d[i][j-1])+1;
}
}
}
return d[n1][n2];
}
private static int min(int i, int j, int k) {
// TODO Auto-generated method stub
int min = Integer.MAX_VALUE;
if(min>i)
min = i;
if(min>j)
min = j;
if(min>k)
min = k;
return min;
}
}