com.naver.dynamicprogramming.levenshtein.Levenshtein.java Source code

Java tutorial

Introduction

Here is the source code for com.naver.dynamicprogramming.levenshtein.Levenshtein.java

Source

/*
 *@(#)Levenshtein.java 2018.02.07
 *
 * Copyright 2018 NHN Corp. All rights Reserved.
 * NHN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package com.naver.dynamicprogramming.levenshtein;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;

/**
 *
 *
 * @author kim.minjoo
 */
public class Levenshtein {
    public static int calculateDistanceRecursive(String str1, String str2) {
        return calculateDistanceRecursive(str1, str2, 0);
    }

    private static int calculateDistanceRecursive(String str1, String str2, int distance) {
        if (StringUtils.isBlank(str1) && StringUtils.isBlank(str2)) {
            return distance;
        }

        if (StringUtils.isBlank(str1)) {
            return distance + str2.length();
        }

        if (StringUtils.isBlank(str2)) {
            return distance + str1.length();
        }

        boolean isEqualEndChar = str1.charAt(str1.length() - 1) == str2.charAt(str2.length() - 1);

        if (isEqualEndChar) {
            return calculateDistanceRecursive(str1.substring(0, str1.length() - 1),
                    str2.substring(0, str2.length() - 1), distance);
        } else {
            int case1 = calculateDistanceRecursive(str1.substring(0, str1.length() - 1),
                    str2.substring(0, str2.length() - 1), distance + 1);
            int case2 = calculateDistanceRecursive(str1, str2.substring(0, str2.length() - 1), distance + 1);
            int case3 = calculateDistanceRecursive(str1.substring(0, str1.length() - 1), str2, distance + 1);

            return NumberUtils.min(case1, case2, case3);
        }
    }

    public static int calculateDistance(String str1, String str2) {
        int[][] distanceArr = new int[str1.length()][str2.length()];
        for (int row = 0; row < distanceArr.length; row++) {
            for (int column = 0; column < distanceArr[row].length; column++) {
                distanceArr[row][column] = 0;
            }
        }

        for (int row = 0; row < distanceArr.length; row++) {
            for (int column = 0; column < distanceArr[row].length; column++) {
                boolean isEqualEndCahr = str1.charAt(row) == str2.charAt(column);
                //ArrayOutOfIndexException?   row, column? 0? .
                if (row == 0 && column == 0) {
                    if (isEqualEndCahr) {
                        distanceArr[row][column] = 0;
                    } else {
                        distanceArr[row][column] = 1;
                    }
                } else if (row == 0) {
                    if (isEqualEndCahr) {
                        distanceArr[row][column] = distanceArr[row][column - 1];
                    } else {
                        distanceArr[row][column] = distanceArr[row][column - 1] + 1;
                    }
                } else if (column == 0) {
                    if (isEqualEndCahr) {
                        distanceArr[row][column] = distanceArr[row - 1][column];
                    } else {
                        distanceArr[row][column] = distanceArr[row - 1][column] + 1;
                    }
                } else {
                    if (isEqualEndCahr) {
                        distanceArr[row][column] = NumberUtils.min(distanceArr[row - 1][column - 1],
                                distanceArr[row][column - 1], distanceArr[row - 1][column]);
                    } else {
                        distanceArr[row][column] = NumberUtils.min(distanceArr[row - 1][column - 1],
                                distanceArr[row][column - 1], distanceArr[row - 1][column]) + 1;
                    }
                }
            }
        }

        return distanceArr[str1.length() - 1][str2.length() - 1];
    }
}