private/Get-WtwEditDistance.ps1

function Get-WtwEditDistance {
    <#
    .SYNOPSIS
        Computes Levenshtein edit distance between two strings (case-insensitive).
    #>

    param([string] $A, [string] $B)
    $a = $A.ToLowerInvariant()
    $b = $B.ToLowerInvariant()
    $la = $a.Length; $lb = $b.Length
    if ($la -eq 0) { return $lb }
    if ($lb -eq 0) { return $la }

    $d = [int[, ]]::new($la + 1, $lb + 1)
    for ($i = 0; $i -le $la; $i++) { $d[$i, 0] = $i }
    for ($j = 0; $j -le $lb; $j++) { $d[0, $j] = $j }
    for ($i = 1; $i -le $la; $i++) {
        for ($j = 1; $j -le $lb; $j++) {
            $cost = if ($a[$i - 1] -eq $b[$j - 1]) { 0 } else { 1 }
            $d[$i, $j] = [Math]::Min(
                [Math]::Min($d[($i - 1), $j] + 1, $d[$i, ($j - 1)] + 1),
                $d[($i - 1), ($j - 1)] + $cost
            )
        }
    }
    return $d[$la, $lb]
}