func LevenshteinDistance(str1, str2 string) int {
	runeStr1 := []rune(str1)
	runeStr2 := []rune(str2)
	runeStr1len := len(runeStr1)
	runeStr2len := len(runeStr2)
	if runeStr1len == 0 {
		return runeStr2len
	} else if runeStr2len == 0 {
		return runeStr1len
	} else if utils.Equal(runeStr1, runeStr2) {
		return 0
	}
	column := make([]int, runeStr1len+1)
	for y := 1; y <= runeStr1len; y++ {
		column[y] = y
	}
	for x := 1; x <= runeStr2len; x++ {
		column[0] = x
		lastkey := x - 1
		for y := 1; y <= runeStr1len; y++ {
			oldkey := column[y]
			var i int
			if runeStr1[y-1] != runeStr2[x-1] {
				i = 1
			}
			column[y] = utils.Min(
				utils.Min(column[y]+1,  
					column[y-1]+1),  
				lastkey+i)  
			lastkey = oldkey
		}
	}
	return column[runeStr1len]
}
LevenshteinDistance calculate the distance between two string
This algorithm allow insertions, deletions and substitutions to change one string to the second
Compatible with non-ASCII characters
package edlib
import "github.com/hbollon/go-edlib/internal/utils"