Palindrome Detection in DSA Rust - Time & Space Complexity
We want to know how the time to check if a word is a palindrome changes as the word gets longer.
How does the number of steps grow when the input string grows?
Analyze the time complexity of the following code snippet.
fn is_palindrome(s: &str) -> bool {
let bytes = s.as_bytes();
let mut left = 0;
let mut right = bytes.len().saturating_sub(1);
while left < right {
if bytes[left] != bytes[right] {
return false;
}
left += 1;
right -= 1;
}
true
}
This code checks if a string reads the same forwards and backwards by comparing characters from both ends moving towards the center.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Comparing characters from the start and end of the string.
- How many times: About half the length of the string (n/2) times.
As the string gets longer, the number of character comparisons grows roughly half as fast.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 5 comparisons |
| 100 | 50 comparisons |
| 1000 | 500 comparisons |
Pattern observation: The number of steps grows linearly with input size, just half as many checks.
Time Complexity: O(n)
This means the time to check a palindrome grows directly in proportion to the string length.
[X] Wrong: "Checking a palindrome takes constant time because we only compare a few characters."
[OK] Correct: Even though we compare pairs from both ends, the number of comparisons grows with the string length, so it is not constant time.
Understanding how palindrome checking scales helps you explain your code clearly and shows you can analyze simple algorithms well.
"What if we used recursion instead of a loop? How would the time complexity change?"
Practice
Solution
Step 1: Understand palindrome definition
A palindrome is a word or phrase that reads the same from left to right and right to left.Step 2: Check options against definition
Only It reads the same forwards and backwards matches this meaning exactly.Final Answer:
It reads the same forwards and backwards -> Option DQuick Check:
Palindrome = Same forwards and backwards [OK]
- Confusing palindrome with unique characters
- Thinking palindrome must be even length
- Assuming palindrome only has vowels
s is a palindrome?Solution
Step 1: Understand Rust string palindrome check
To check palindrome, compare characters iterator with its reverse iterator.Step 2: Analyze options
s.chars().eq(s.chars().rev()) useschars().eq(chars().rev())which correctly compares forward and backward characters. Options A and C use invalid methods or wrong comparisons. s.chars().all(|c| c == s.chars().next().unwrap()) checks if all characters are same, not palindrome.Final Answer:
s.chars().eq(s.chars().rev()) -> Option BQuick Check:
Compare chars iterator with reversed iterator [OK]
- Using reverse() method on &str which does not exist
- Comparing string with reversed string incorrectly
- Checking all chars equal instead of palindrome
let s = "racecar";
let result = s.chars().eq(s.chars().rev());
println!("{}", result);Solution
Step 1: Analyze the string and palindrome check
The string "racecar" reads the same forwards and backwards, so it is a palindrome.Step 2: Understand the code output
The code compares characters forward and backward and returns true for palindrome strings. So, it prints true.Final Answer:
true -> Option AQuick Check:
"racecar" palindrome check = true [OK]
- Assuming palindrome check returns false for odd length
- Thinking code causes compile or runtime error
- Confusing output with string itself
fn is_palindrome(s: &str) -> bool {
s == s.chars().rev().collect::<String>()
}Solution
Step 1: Understand types in comparison
The left side is &str, right side is String from collect(). Direct comparison between &str and String is not allowed.Step 2: Fix type mismatch
Convert left side to String or right side to &str for comparison. For example, uses.to_string() == s.chars().rev().collect::<String>().Final Answer:
Cannot compare &str with String directly -> Option AQuick Check:
Type mismatch in comparison causes error [OK]
- Ignoring type mismatch error
- Assuming collect needs semicolon inside expression
- Thinking chars().rev() is invalid method
Solution
Step 1: Remove spaces and convert to lowercase
let filtered: String = s.chars().filter(|c| !c.is_whitespace()).collect(); let lower = filtered.to_lowercase(); let is_pal = lower.chars().eq(lower.chars().rev()); filters out whitespace, collects characters, then converts to lowercase string.Step 2: Check palindrome on cleaned string
It compares characters forward and backward correctly on the cleaned lowercase string.Final Answer:
let filtered: String = s.chars().filter(|c| !c.is_whitespace()).collect(); let lower = filtered.to_lowercase(); let is_pal = lower.chars().eq(lower.chars().rev()); -> Option CQuick Check:
Filter spaces + lowercase + compare reversed chars [OK]
- Using reverse() method which does not exist
- Filtering only whitespace but not converting case
- Checking all chars alphanumeric instead of palindrome
Ready to prove it?
Pass the test and this pattern moves unknown
