Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
963 B
59 lines
963 B
package flags |
|
|
|
func levenshtein(s string, t string) int { |
|
if len(s) == 0 { |
|
return len(t) |
|
} |
|
|
|
if len(t) == 0 { |
|
return len(s) |
|
} |
|
|
|
dists := make([][]int, len(s)+1) |
|
for i := range dists { |
|
dists[i] = make([]int, len(t)+1) |
|
dists[i][0] = i |
|
} |
|
|
|
for j := range t { |
|
dists[0][j] = j |
|
} |
|
|
|
for i, sc := range s { |
|
for j, tc := range t { |
|
if sc == tc { |
|
dists[i+1][j+1] = dists[i][j] |
|
} else { |
|
dists[i+1][j+1] = dists[i][j] + 1 |
|
if dists[i+1][j] < dists[i+1][j+1] { |
|
dists[i+1][j+1] = dists[i+1][j] + 1 |
|
} |
|
if dists[i][j+1] < dists[i+1][j+1] { |
|
dists[i+1][j+1] = dists[i][j+1] + 1 |
|
} |
|
} |
|
} |
|
} |
|
|
|
return dists[len(s)][len(t)] |
|
} |
|
|
|
func closestChoice(cmd string, choices []string) (string, int) { |
|
if len(choices) == 0 { |
|
return "", 0 |
|
} |
|
|
|
mincmd := -1 |
|
mindist := -1 |
|
|
|
for i, c := range choices { |
|
l := levenshtein(cmd, c) |
|
|
|
if mincmd < 0 || l < mindist { |
|
mindist = l |
|
mincmd = i |
|
} |
|
} |
|
|
|
return choices[mincmd], mindist |
|
}
|
|
|