@@ -65,40 +65,40 @@ func OSADamerauLevenshteinDistance(str1, str2 string) int {
6565 return runeStr1len
6666 } else if utils .Equal (runeStr1 , runeStr2 ) {
6767 return 0
68+ } else if runeStr1len < runeStr2len {
69+ return OSADamerauLevenshteinDistance (str2 , str1 )
6870 }
6971
7072 // 2D Array
71- matrix := make ([][]int , runeStr1len + 1 )
72- for i := 0 ; i <= runeStr1len ; i ++ {
73+ row := utils .Min (runeStr1len + 1 , 3 )
74+ matrix := make ([][]int , row )
75+ for i := 0 ; i < row ; i ++ {
7376 matrix [i ] = make ([]int , runeStr2len + 1 )
74- for j := 0 ; j <= runeStr2len ; j ++ {
75- matrix [i ][j ] = 0
76- }
77- }
78-
79- for i := 0 ; i <= runeStr1len ; i ++ {
8077 matrix [i ][0 ] = i
8178 }
79+
8280 for j := 0 ; j <= runeStr2len ; j ++ {
8381 matrix [0 ][j ] = j
8482 }
8583
8684 var count int
8785 for i := 1 ; i <= runeStr1len ; i ++ {
86+ matrix [i % 3 ][0 ] = i
8887 for j := 1 ; j <= runeStr2len ; j ++ {
8988 if runeStr1 [i - 1 ] == runeStr2 [j - 1 ] {
9089 count = 0
9190 } else {
9291 count = 1
9392 }
9493
95- matrix [i ][j ] = utils .Min (utils .Min (matrix [i - 1 ][j ]+ 1 , matrix [i ][j - 1 ]+ 1 ), matrix [i - 1 ][j - 1 ]+ count ) // insertion, deletion, substitution
94+ matrix [i % 3 ][j ] = utils .Min (utils .Min (matrix [(i - 1 )% 3 ][j ]+ 1 , matrix [i % 3 ][j - 1 ]+ 1 ),
95+ matrix [(i - 1 )% 3 ][j - 1 ]+ count ) // insertion, deletion, substitution
9696 if i > 1 && j > 1 && runeStr1 [i - 1 ] == runeStr2 [j - 2 ] && runeStr1 [i - 2 ] == runeStr2 [j - 1 ] {
97- matrix [i ][j ] = utils .Min (matrix [i ][j ], matrix [i - 2 ][j - 2 ]+ 1 ) // translation
97+ matrix [i % 3 ][j ] = utils .Min (matrix [i % 3 ][j ], matrix [( i - 2 ) % 3 ][j - 2 ]+ 1 ) // translation
9898 }
9999 }
100100 }
101- return matrix [runeStr1len ][runeStr2len ]
101+ return matrix [runeStr1len % 3 ][runeStr2len ]
102102}
103103
104104// DamerauLevenshteinDistance calculate the distance between two string
0 commit comments