Levenshtein distance: Difference between revisions
Content added Content deleted
(easylang) |
(Add Zig example) |
||
Line 6,465: | Line 6,465: | ||
3 |
3 |
||
</pre> |
</pre> |
||
=={{header|Zig}}== |
|||
{{trans|C}} |
|||
'''Works with:''' 0.11.x, 0.12.0-dev.1381+61861ef39 |
|||
For 0.10.x, replace @min(a, b, c) with std.math.min3(a, b, c). |
|||
Recursive method without memoization. |
|||
<syntaxhighlight lang="zig">const std = @import("std"); |
|||
fn levenshtein(s: []const u8, t: []const u8) usize { |
|||
// If either string is empty, difference is inserting all chars |
|||
// from the other |
|||
if (s.len == 0) return t.len; |
|||
if (t.len == 0) return s.len; |
|||
// If last letters are the same, the difference is whatever is |
|||
// required to edit the rest of the strings |
|||
if (s[s.len - 1] == t[t.len - 1]) |
|||
return levenshtein(s[0 .. s.len - 1], t[0 .. t.len - 1]); |
|||
// Else try: |
|||
// changing last letter of s to that of t; or |
|||
// remove last letter of s; or |
|||
// remove last letter of t, |
|||
// any of which is 1 edit plus editing the rest of the strings |
|||
const a = levenshtein(s[0 .. s.len - 1], t[0 .. t.len - 1]); |
|||
const b = levenshtein(s, t[0 .. t.len - 1]); |
|||
const c = levenshtein(s[0 .. s.len - 1], t); |
|||
return @min(a, b, c) + 1; |
|||
} |
|||
pub fn main() std.fs.File.WriteError!void { |
|||
const stdout = std.io.getStdOut(); |
|||
const stdout_w = stdout.writer(); |
|||
const s1 = "rosettacode"; |
|||
const s2 = "raisethysword"; |
|||
try stdout_w.print("distance between '{s}' and '{s}': {d}\n", .{ s1, s2, levenshtein(s1, s2) }); |
|||
return; |
|||
}</syntaxhighlight> |
|||
=={{header|zkl}}== |
=={{header|zkl}}== |