How to resolve the algorithm Levenshtein distance/Alignment step by step in the Nim programming language
How to resolve the algorithm Levenshtein distance/Alignment step by step in the Nim programming language
Table of Contents
Problem Statement
The Levenshtein distance algorithm returns the number of atomic operations (insertion, deletion or edition) that must be performed on a string in order to obtain an other one, but it does not say anything about the actual operations used or their order. An alignment is a notation used to describe the operations used to turn a string into an other. At some point in the strings, the minus character ('-') is placed in order to signify that a character must be added at this very place. For instance, an alignment between the words 'place' and 'palace' is:
Write a function that shows the alignment of two strings for the corresponding levenshtein distance.
As an example, use the words "rosettacode" and "raisethysword".
You can either implement an algorithm, or use a dedicated library (thus showing us how it is named in your language).
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Levenshtein distance/Alignment step by step in the Nim programming language
Source code in the nim programming language
import algorithm, sequtils, strutils
proc levenshteinAlign(a, b: string): tuple[a, b: string] =
let a = a.toLower()
let b = b.toLower()
var costs = newSeqWith(a.len + 1, newSeq[int](b.len + 1))
for j in 0..b.len: costs[0][j] = j
for i in 1..a.len:
costs[i][0] = i
for j in 1..b.len:
let tmp = costs[i - 1][j - 1] + ord(a[i - 1] != b[j - 1])
costs[i][j] = min(1 + min(costs[i - 1][j], costs[i][j - 1]), tmp)
# Walk back through matrix to figure out path.
var aPathRev, bPathRev: string
var i = a.len
var j = b.len
while i != 0 and j != 0:
let tmp = costs[i - 1][j - 1] + ord(a[i - 1] != b[j - 1])
if costs[i][j] == tmp:
dec i
dec j
aPathRev.add a[i]
bPathRev.add b[j]
elif costs[i][j] == 1 + costs[i-1][j]:
dec i
aPathRev.add a[i]
bPathRev.add '-'
elif costs[i][j] == 1 + costs[i][j-1]:
dec j
aPathRev.add '-'
bPathRev.add b[j]
else:
quit "Internal error"
result = (reversed(aPathRev).join(), reversed(bPathRev).join())
when isMainModule:
var result = levenshteinAlign("place", "palace")
echo result.a
echo result.b
echo ""
result = levenshteinAlign("rosettacode","raisethysword")
echo result.a
echo result.b
You may also check:How to resolve the algorithm Read entire file step by step in the Action! programming language
You may also check:How to resolve the algorithm Create a two-dimensional array at runtime step by step in the R programming language
You may also check:How to resolve the algorithm String append step by step in the F# programming language
You may also check:How to resolve the algorithm Dinesman's multiple-dwelling problem step by step in the Java programming language
You may also check:How to resolve the algorithm Rename a file step by step in the Lasso programming language