public class MinEditorDictance{
protected static final int MAX_NUM=1000;//数组最大长度
protected static int[][] matrix=new int[MAX_NUM][MAX_NUM];//数组矩阵,matrix[m][n]表示长度为m,长度为n的字符串的最小编辑距离
/**如果数组空间不够重新分配大小**/
protected static boolean modifyArrays(int[][] array,int m,int n){//m为所需要行的高度,n为所需要列的高度
if(m<=0||n<=0)return false;//改变
if(array.length<m || array[0].length<n){
array=new int[m][n];
}
return true;
}
/**初始化矩阵**/
protected static void initMatrix(int[][] array,int len1,int len2){//m为字符串长度
array[0][0]=0;
for(int i=1;i<=len1;++i){
array[i][0]=i;
}
for(int i=1;i<=len2;++i){
array[0][i]=i;
}
}
/**求最小值**/
protected static int min(int... num){
int min=Integer.MAX_VALUE;
for(int i=0;i<num.length;++i){
if(min>num[i])min=num[i];
}
return min;
}
/**最小编辑距离**/
public static int minEdtDic(String str1,String str2){
if(null==str1 && null==str2)return -1;
if(null==str1)return str2.length();
if(null==str2)return str1.length();
int len1=str1.length(),len2=str2.length();//获取两个字符串长度
if(!modifyArrays(matrix,len1+1,len2+1))return -1;//检测数组长度,如果小则拓展矩阵,如果参数不合法,返回-1
initMatrix(matrix,len1,len2);//初始化最小编辑距离矩阵数组
for(int i=0;i<len1;++i){//遍历字符串1
for(int j=0;j<len2;++j){//遍历字符串2
if(str1.charAt(i)==str2.charAt(j)){
matrix[i+1][j+1]=matrix[i][j];//如果字符相等则字符串1,字符串2回退一个字符的最小编辑距离
}else{
matrix[i+1][j+1]=min(matrix[i+1][j],matrix[i][j+1],matrix[i][j])+1;
}
}
}
return matrix[len1][len2];
}
/**测试例子**/
public static void main(String[] args){
String[] strs=new String[]{"abcdefg","abcddefg","abcd","abc","abcde","aace","a","a"};
for(int i=0;i<strs.length/2;++i){
System.out.println(strs[i*2]+"->"+strs[i*2+1]+"="+minEdtDic(strs[i*2], strs[i*2+1]));
}
}
}
最小编辑距离代码