编辑距离算法-java实现

算法讲解见链接:编辑距离算法(Edit Distance)_编程小栈-CSDN博客_编辑距离

这里假设str1是"abc",str2是"1a3",从str2变为str1。

事实上,str1和str2可以是任意长度字符串

直接上代码(java实现):

public class editDist {
    public static void main(String[] args) {
        editDistDef distDef = new editDistDef();
        String[] str1 = {"a","b","c"};
        String[] str2 = {"1","a","3"};
        distDef.distance(str1, str2);
    }
}

class editDistDef{
    public void distance(String[] str1, String[] str2){
        int column = str1.length+1;
        int row = str2.length+1;
        int[][] dist = new int[row][column];

        System.out.println("dist数组行数:"+dist.length);
        System.out.println("dist数组列数:"+dist[0].length);

        //初始化二维数组
        for (int i=0;i<row;i++){
            for (int j=0;j<column;j++){
                dist[i][j]=-1;
            }
        }

        //打印初始化数组
        System.out.println("初始化dist数组:");
        printArray(row, column, dist);

        //初始化第一列
        for (int i=0;i<row;i++){
            dist[i][0]=i;
        }

        //初始化第一行
        for(int i=0;i<column;i++){
            dist[0][i]=i;
        }

        System.out.println("打印初始化首行首列的dist数组:");
        printArray(row, column, dist);

        int temp;
        for (int i=1;i<column;i++){
            for (int j=1;j<row;j++){
                if (str2[j-1].equals(str1[i-1]))
                    temp=0;
                else
                    temp=1;
                int leastDist = compare(dist[j][i-1]+1, dist[j-1][i]+1 , dist[j-1][i-1]+temp);
                dist[j][i]=leastDist;
                System.out.println("打印赋值dist["+j+"]["+i+"]"+"后的数组:");
                printArray(row, column, dist);
            }
        }

        System.out.println("打印最终dist数组:");
        printArray(row, column, dist);


        System.out.println("最小编辑距离是:" + dist[row-1][column-1]);
    }

    public int compare(int x, int y, int z){
        int least = x;
        if(least>y)
            least=y;
        if (least>z)
            least=z;
        return least;
    }

    private void printArray(int row, int column, int[][] dist) {
        int n = 1;
        for (int i=0;i<row;i++){
            for (int j=0;j<column;j++){
                System.out.print(dist[i][j]+"、");
                if (n%column==0) //按行打印
                    System.out.println("");
                n++;
            }
        }
        System.out.println("");
    }
}

结果:

dist数组行数:4
dist数组列数:4
初始化dist数组:
-1、-1、-1、-1、
-1、-1、-1、-1、
-1、-1、-1、-1、
-1、-1、-1、-1、

打印初始化首行首列的dist数组:
0、1、2、3、
1、-1、-1、-1、
2、-1、-1、-1、
3、-1、-1、-1、

打印赋值dist[1][1]后的数组:
0、1、2、3、
1、1、-1、-1、
2、-1、-1、-1、
3、-1、-1、-1、

打印赋值dist[2][1]后的数组:
0、1、2、3、
1、1、-1、-1、
2、1、-1、-1、
3、-1、-1、-1、

打印赋值dist[3][1]后的数组:
0、1、2、3、
1、1、-1、-1、
2、1、-1、-1、
3、2、-1、-1、

打印赋值dist[1][2]后的数组:
0、1、2、3、
1、1、2、-1、
2、1、-1、-1、
3、2、-1、-1、

打印赋值dist[2][2]后的数组:
0、1、2、3、
1、1、2、-1、
2、1、2、-1、
3、2、-1、-1、

打印赋值dist[3][2]后的数组:
0、1、2、3、
1、1、2、-1、
2、1、2、-1、
3、2、2、-1、

打印赋值dist[1][3]后的数组:
0、1、2、3、
1、1、2、3、
2、1、2、-1、
3、2、2、-1、

打印赋值dist[2][3]后的数组:
0、1、2、3、
1、1、2、3、
2、1、2、3、
3、2、2、-1、

打印赋值dist[3][3]后的数组:
0、1、2、3、
1、1、2、3、
2、1、2、3、
3、2、2、3、

打印最终dist数组:
0、1、2、3、
1、1、2、3、
2、1、2、3、
3、2、2、3、

最小编辑距离是:3

猜你喜欢

转载自blog.csdn.net/li1593891525/article/details/116668668