in Sources/ArgumentParser/Utilities/StringExtensions.swift [136:168]
func editDistance(to target: String) -> Int {
let rows = self.count
let columns = target.count
if rows <= 0 || columns <= 0 {
return max(rows, columns)
}
var matrix = Array(repeating: Array(repeating: 0, count: columns + 1), count: rows + 1)
for row in 1...rows {
matrix[row][0] = row
}
for column in 1...columns {
matrix[0][column] = column
}
for row in 1...rows {
for column in 1...columns {
let source = self[self.index(self.startIndex, offsetBy: row - 1)]
let target = target[target.index(target.startIndex, offsetBy: column - 1)]
let cost = source == target ? 0 : 1
matrix[row][column] = Swift.min(
matrix[row - 1][column] + 1,
matrix[row][column - 1] + 1,
matrix[row - 1][column - 1] + cost
)
}
}
return matrix.last!.last!
}