(a: string, b: string, maxDist: number)
| 155 | * callers should pass `lowercase(name)` strings. |
| 156 | */ |
| 157 | export function boundedEditDistance(a: string, b: string, maxDist: number): number { |
| 158 | if (a === b) return 0; |
| 159 | const al = a.length; |
| 160 | const bl = b.length; |
| 161 | if (Math.abs(al - bl) > maxDist) return maxDist + 1; |
| 162 | if (al === 0) return bl; |
| 163 | if (bl === 0) return al; |
| 164 | |
| 165 | let prev = new Array<number>(bl + 1); |
| 166 | let cur = new Array<number>(bl + 1); |
| 167 | for (let j = 0; j <= bl; j++) prev[j] = j; |
| 168 | |
| 169 | for (let i = 1; i <= al; i++) { |
| 170 | cur[0] = i; |
| 171 | let rowMin = cur[0]!; |
| 172 | for (let j = 1; j <= bl; j++) { |
| 173 | const cost = a.charCodeAt(i - 1) === b.charCodeAt(j - 1) ? 0 : 1; |
| 174 | const insertion = cur[j - 1]! + 1; |
| 175 | const deletion = prev[j]! + 1; |
| 176 | const substitution = prev[j - 1]! + cost; |
| 177 | cur[j] = Math.min(insertion, deletion, substitution); |
| 178 | if (cur[j]! < rowMin) rowMin = cur[j]!; |
| 179 | } |
| 180 | if (rowMin > maxDist) return maxDist + 1; |
| 181 | [prev, cur] = [cur, prev]; |
| 182 | } |
| 183 | return prev[bl]!; |
| 184 | } |
no outgoing calls
no test coverage detected