📖 Scenario: You are building a simple text comparison tool that helps find how different two words are. This is useful in spell checkers and search suggestions.
🎯 Goal: Build a program that calculates the Levenshtein edit distance between two words. This distance tells how many single-letter changes (insertions, deletions, or substitutions) are needed to change one word into the other.
📋 What You'll Learn
Create two string variables with exact values
Create a 2D vector to hold distances
Use nested loops to fill the distance matrix using the Levenshtein formula
Print the final edit distance value
💡 Why This Matters
🌍 Real World
Spell checkers, search engines, and auto-correct features use edit distance to suggest correct words.
💼 Career
Understanding dynamic programming and string algorithms is essential for software engineers working on text processing, search, and data cleaning.
Progress0 / 4 steps
1
Create the two words to compare
Create two string variables called word1 and word2 with the exact values "kitten" and "sitting" respectively.
DSA Rust
Hint
Use let to create variables and assign the exact strings.
2
Initialize the distance matrix
Create a 2D vector called dist with dimensions (word1.len() + 1) by (word2.len() + 1) filled with zeros. Then fill the first row with values from 0 to word2.len() and the first column with values from 0 to word1.len().
DSA Rust
Hint
Use vec![vec![0; cols]; rows] to create the 2D vector. Use for loops with 0..=length to fill edges.
3
Fill the distance matrix with Levenshtein logic
Use nested for loops with variables i from 1 to word1.len() and j from 1 to word2.len(). Inside, check if word1.chars().nth(i - 1).unwrap() equals word2.chars().nth(j - 1).unwrap(). If equal, set dist[i][j] = dist[i - 1][j - 1]. Otherwise, set dist[i][j] to 1 plus the minimum of dist[i - 1][j], dist[i][j - 1], and dist[i - 1][j - 1].
DSA Rust
Hint
Use nested loops and compare characters at positions i-1 and j-1. Use std::cmp::min to find the smallest cost.
4
Print the final edit distance
Print the value at dist[word1.len()][word2.len()] which is the Levenshtein edit distance between word1 and word2.
DSA Rust
Hint
Use println!("{}", dist[word1.len()][word2.len()]) to print the final distance.
Practice
(1/5)
1. What does the Levenshtein distance between two strings measure?
easy
A. The minimum number of single-character edits to change one string into the other
B. The maximum number of matching characters between two strings
C. The length difference between two strings
D. The number of common substrings between two strings
Solution
Step 1: Understand the definition of Levenshtein distance
It counts the smallest number of edits (insertions, deletions, substitutions) needed to convert one string into another.
Step 2: Compare options with the definition
Only The minimum number of single-character edits to change one string into the other correctly describes this minimum edit count concept.
Final Answer:
The minimum number of single-character edits to change one string into the other -> Option A
Quick Check:
Levenshtein distance = minimum edits [OK]
Hint: Think of edits needed to transform one word to another [OK]
Common Mistakes:
Confusing with longest common subsequence
Thinking it measures string length difference only
Assuming it counts matching characters
2. Which Rust code snippet correctly initializes a 2D vector for Levenshtein distance with dimensions (m+1) x (n+1)?
easy
A. let dp = vec![vec![0; m+1]; n+1];
B. let mut dp = vec![vec![0; n+1]; m+1];
C. let mut dp = vec![vec![0; m]; n];
D. let dp = vec![vec![0; n]; m];
Solution
Step 1: Identify correct dimensions for DP table
The DP table for Levenshtein distance has (m+1) rows and (n+1) columns, where m and n are string lengths.
Step 2: Match Rust vector initialization syntax
let mut dp = vec![vec![0; n+1]; m+1]; correctly creates a mutable 2D vector with m+1 rows and n+1 columns filled with zeros.
3. What is the output of the following Rust code snippet calculating Levenshtein distance between "kitten" and "sitting"?
fn main() {
let s1 = "kitten";
let s2 = "sitting";
let m = s1.len();
let n = s2.len();
let mut dp = vec![vec![0; n + 1]; m + 1];
for i in 0..=m {
dp[i][0] = i;
}
for j in 0..=n {
dp[0][j] = j;
}
for i in 1..=m {
for j in 1..=n {
if s1.as_bytes()[i - 1] == s2.as_bytes()[j - 1] {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = 1 + std::cmp::min(
dp[i - 1][j - 1],
std::cmp::min(dp[i][j - 1], dp[i - 1][j]),
);
}
}
}
println!("{}", dp[m][n]);
}
medium
A. 4
B. 3
C. 5
D. 6
Solution
Step 1: Understand the strings and DP setup
Strings are "kitten" (length 6) and "sitting" (length 7). The DP table is correctly initialized and filled using Levenshtein logic.
Step 2: Calculate Levenshtein distance manually
Transform "kitten" to "sitting" requires 3 substitutions and 1 insertion, total 4 edits.
4. Identify the bug in this Rust code snippet for Levenshtein distance:
for i in 1..m {
for j in 1..n {
if s1.as_bytes()[i - 1] == s2.as_bytes()[j - 1] {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = 1 + std::cmp::min(
dp[i - 1][j - 1],
std::cmp::min(dp[i][j - 1], dp[i - 1][j]),
);
}
}
}
medium
A. Not initializing dp[0][j] and dp[i][0] before loops
B. Indexing s1 and s2 with i and j instead of i-1 and j-1
C. Loop ranges should be 1..=m and 1..=n to include last indices
D. Using std::cmp::max instead of std::cmp::min in calculation
Solution
Step 1: Check loop ranges for DP filling
Loops use 1..m and 1..n which exclude the last index (m and n). They should be inclusive (1..=m and 1..=n) to cover all characters.
Step 2: Verify other code parts
Indexing with i-1 and j-1 is correct, min is used properly, and initialization is assumed done outside snippet.
Final Answer:
Loop ranges should be 1..=m and 1..=n to include last indices -> Option C
Quick Check:
Inclusive loops needed for full DP table [OK]
Hint: Use inclusive ranges 1..=m and 1..=n for full coverage [OK]
Common Mistakes:
Using exclusive ranges missing last character
Incorrect indexing causing panic
Skipping DP initialization
5. Given two strings s1 = "intention" and s2 = "execution", what is the Levenshtein distance computed by the Rust algorithm?
Use the standard operations: insert, delete, substitute with cost 1 each.
hard
A. 7
B. 8
C. 5
D. 6
Solution
Step 1: Analyze the strings and possible edits
"intention" (i n t e n t i o n) to "execution" (e x e c u t i o n). Minimal edits: substitute i->e, n->x, t->e, e->c, n->u, plus one insertion or deletion needed, total 6 edits.
Step 2: Confirm with Levenshtein algorithm logic
The DP computes the minimum cost as 6.
Final Answer:
6 -> Option D
Quick Check:
Levenshtein("intention", "execution") = 6 [OK]
Hint: Count minimal edits stepwise between strings [OK]
Common Mistakes:
Ignoring insertions or deletions
Miscounting substitutions
Assuming equal length means zero edits
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.