📖 Scenario: Imagine you are building a simple text checker that tells if a word or sentence reads the same forwards and backwards, ignoring spaces, punctuation, and letter case. This is called a palindrome.For example, "Race car" is a palindrome because if you ignore spaces and case, it reads the same backwards.
🎯 Goal: You will create a program that uses two pointers to check if a given string is a palindrome. The program will ignore spaces, punctuation, and case differences.
📋 What You'll Learn
Create a string variable with a specific sentence.
Create two pointers (indexes) to check characters from start and end.
Use a loop to move pointers inward while skipping non-alphanumeric characters.
Compare characters ignoring case to decide if the string is a palindrome.
Print true if it is a palindrome, otherwise false.
💡 Why This Matters
🌍 Real World
Palindrome checking is useful in text processing, data validation, and coding challenges.
💼 Career
Understanding two-pointer techniques helps in string manipulation tasks common in software development and interviews.
Progress0 / 4 steps
1
Create the input string
Create a variable called input and set it to the string "A man, a plan, a canal: Panama".
DSA Rust
Hint
Use let input = "A man, a plan, a canal: Panama"; to create the string.
2
Set up two pointers for checking
Create two variables called left and right. Set left to 0 and right to input.len() - 1.
DSA Rust
Hint
Use let mut left = 0; and let mut right = input.len() - 1; to create the pointers.
3
Use two pointers to check palindrome ignoring non-alphanumeric and case
Write a while loop that runs while left < right. Inside the loop, skip characters at left and right if they are not alphanumeric using input.as_bytes()[left].is_ascii_alphanumeric(). Compare characters ignoring case by converting them to lowercase. If characters differ, break the loop.
DSA Rust
Hint
Use a while left < right loop. Skip non-alphanumeric characters by checking bytes[left].is_ascii_alphanumeric() and bytes[right].is_ascii_alphanumeric(). Compare lowercase characters with to_ascii_lowercase().
4
Print the result
Print the value of is_palindrome using println!("{}", is_palindrome);.
DSA Rust
Hint
Use println!("{}", is_palindrome); to print the result.
Practice
(1/5)
1. What is the main idea behind the two-pointer technique to check if a string is a palindrome?
easy
A. Reverse the string and compare it with the original string
B. Use two pointers starting from both ends and move towards the center comparing characters
C. Count the frequency of each character and check if all counts are even
D. Sort the characters and check if the sorted string equals the original
Solution
Step 1: Understand two-pointer approach
The two-pointer technique uses one pointer at the start and one at the end of the string.
Step 2: Compare characters moving inward
Both pointers move towards the center, comparing characters at each step to check equality.
Final Answer:
Use two pointers starting from both ends and move towards the center comparing characters -> Option B
Quick Check:
Two-pointer technique = Use two pointers starting from both ends and move towards the center comparing characters [OK]
Hint: Compare characters from both ends moving inward [OK]
Common Mistakes:
Thinking reversing string is the two-pointer method
Checking character counts instead of positions
Sorting string changes order, not palindrome check
2. Which Rust code snippet correctly initializes two pointers for palindrome checking on a string s?
easy
A. let (mut left, mut right) = (0, s.len() - 1);
B. let (left, right) = (0, s.len());
C. let (mut left, mut right) = (1, s.len() - 1);
D. let (left, right) = (1, s.len());
Solution
Step 1: Identify pointer initialization for indices
Left pointer starts at 0 (first char), right pointer at last index (length - 1).
Step 2: Check mutability and correct indices
Both pointers must be mutable to move; right pointer must be s.len() - 1 to avoid out-of-bounds.
Final Answer:
let (mut left, mut right) = (0, s.len() - 1); -> Option A
Hint: Start left at 0 and right at length minus one [OK]
Common Mistakes:
Using s.len() as right index causes out-of-bounds
Not making pointers mutable
Starting left pointer at 1 skips first character
3. What will be the output of the following Rust code snippet?
fn is_palindrome(s: &str) -> bool {
let bytes = s.as_bytes();
let (mut left, mut right) = (0, bytes.len() - 1);
while left < right {
if bytes[left] != bytes[right] {
return false;
}
left += 1;
right -= 1;
}
true
}
fn main() {
println!("{}", is_palindrome("racecar"));
println!("{}", is_palindrome("hello"));
}
medium
A. false\nfalse
B. false\ntrue
C. true\nfalse
D. true\ntrue
Solution
Step 1: Check palindrome for "racecar"
Characters match from both ends moving inward, so returns true.
Step 2: Check palindrome for "hello"
Characters differ at first comparison ('h' vs 'o'), so returns false.
Final Answer:
true\nfalse -> Option C
Quick Check:
racecar = true, hello = false [OK]
Hint: Check first and last chars; mismatch means false [OK]
Common Mistakes:
Assuming hello is palindrome
Confusing output order
Ignoring early return on mismatch
4. Identify the bug in this Rust function that checks palindrome and select the fix:
fn is_palindrome(s: &str) -> bool {
let bytes = s.as_bytes();
let (mut left, mut right) = (0, bytes.len());
while left < right {
if bytes[left] != bytes[right] {
return false;
}
left += 1;
right -= 1;
}
true
}
medium
A. Change right initialization to bytes.len() - 1
B. Change while condition to left <= right
C. Make left and right immutable
D. Use s.chars() instead of bytes
Solution
Step 1: Identify out-of-bounds error
Right pointer is set to bytes.len(), which is out of valid index range (0 to len-1).
Step 2: Fix pointer initialization
Set right to bytes.len() - 1 to point to last valid character index.
Final Answer:
Change right initialization to bytes.len() - 1 -> Option A
Quick Check:
Right pointer must be last index = Change right initialization to bytes.len() - 1 [OK]
Hint: Right pointer = length minus one to avoid out-of-bounds [OK]
Common Mistakes:
Using length as index causes panic
Changing while condition without fixing index
Making pointers immutable prevents movement
5. Given the string s = "A man, a plan, a canal: Panama", which Rust code modification correctly checks if s is a palindrome ignoring non-alphanumeric characters and case using two pointers?
hard
A. Convert string to uppercase and compare characters including punctuation
B. Reverse the string and compare directly without filtering
C. Count characters ignoring case but include spaces and punctuation
D. Use two pointers skipping non-alphanumeric chars and compare lowercase characters
Solution
Step 1: Understand problem requirements
We must ignore non-alphanumeric characters and case differences when checking palindrome.
Step 2: Apply two-pointer with skipping and case normalization
Move pointers inward, skip chars that are not letters or digits, compare lowercase versions of characters.
Final Answer:
Use two pointers skipping non-alphanumeric chars and compare lowercase characters -> Option D
Quick Check:
Skip non-alphanumeric + lowercase compare = Use two pointers skipping non-alphanumeric chars and compare lowercase characters [OK]
Hint: Skip non-letters/digits and compare lowercase chars [OK]
Common Mistakes:
Comparing with punctuation included
Ignoring case differences
Reversing string without filtering
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.