String Reversal Approaches in DSA Rust - Time & Space Complexity
We want to understand how the time needed to reverse a string changes as the string gets longer.
How does the work grow when the input string size increases?
Analyze the time complexity of the following code snippet.
fn reverse_string(s: &mut String) {
let bytes = unsafe { std::slice::from_raw_parts_mut(s.as_mut_ptr(), s.len()) };
let mut left = 0;
let mut right = bytes.len() - 1;
while left < right {
bytes.swap(left, right);
left += 1;
right -= 1;
}
}
This code reverses a string in place by swapping characters from the start and end moving towards the center.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Swapping two characters in the string.
- How many times: About half the length of the string (n/2 times).
As the string gets longer, the number of swaps grows roughly half as fast as the string length.
| Input Size (n) | Approx. Operations (swaps) |
|---|---|
| 10 | 5 |
| 100 | 50 |
| 1000 | 500 |
Pattern observation: The operations grow linearly with the input size.
Time Complexity: O(n)
This means the time to reverse the string grows directly in proportion to the string length.
[X] Wrong: "Reversing a string takes constant time because we just swap characters."
[OK] Correct: Each swap takes time, and the number of swaps grows with the string length, so the total time grows linearly.
Understanding how simple operations like string reversal scale helps you reason about more complex algorithms and shows you can analyze code efficiently.
"What if we used recursion to reverse the string instead? How would the time complexity change?"
Practice
chars().rev().collect() method chain do when applied to a Rust string?Solution
Step 1: Understand
Thechars()methodchars()method converts the string into an iterator over its characters.Step 2: Apply
Therev()andcollect()rev()method reverses the iterator, andcollect()gathers the reversed characters into a new string.Final Answer:
It reverses the characters of the string and collects them into a new string. -> Option AQuick Check:
chars().rev().collect()reverses string [OK]
- Thinking it sorts characters instead of reversing
- Confusing rev() with removing characters
- Assuming it changes case of letters
s?Solution
Step 1: Check method availability
Rust strings do not have areverse()method, so let reversed: String = s.reverse(); is invalid.Step 2: Analyze method chaining
let reversed: String = s.chars().rev().collect(); useschars()to get characters,rev()to reverse, andcollect()to form a new string, which is correct.Final Answer:
let reversed: String = s.chars().rev().collect(); -> Option BQuick Check:
Correct syntax for string reversal is let reversed: String = s.chars().rev().collect(); [OK]
- Using non-existent reverse() method on String
- Wrong order of method calls
- Trying to reverse after collecting into String
let s = String::from("rust");
let reversed: String = s.chars().rev().collect();
println!("{}", reversed);Solution
Step 1: Understand input string
The string"rust"has characters 'r', 'u', 's', 't'.Step 2: Reverse characters and collect
Usingchars().rev().collect()reverses the characters to 't', 's', 'u', 'r' and collects into a new string.Final Answer:
tsur -> Option CQuick Check:
Reversed "rust" = "tsur" [OK]
- Expecting original string output
- Mixing character order incorrectly
- Assuming runtime error on reversal
let s = String::from("hello");
let reversed = s.reverse();
println!("{}", reversed);Solution
Step 1: Check method existence on String
Rust's String type does not have areverse()method, so calling it causes a compile error.Step 2: Confirm other syntax correctness
The semicolon afterprintln!is present, and printing a string is valid, so no errors there.Final Answer:
String type has no method named reverse() -> Option DQuick Check:
reverse() method does not exist on String [OK]
- Assuming reverse() exists on String
- Thinking reverse() returns vector automatically
- Ignoring compiler error messages
Solution
Step 1: Understand Unicode grapheme clusters
Some characters like emojis or accented letters are multiple Unicode code points but one visible character (grapheme cluster).Step 2: Use appropriate crate and method
Theunicode-segmentationcrate providesgraphemes()method to split string by grapheme clusters, which can then be reversed safely.Final Answer:
Use the unicode-segmentation crate to split by graphemes, then reverse and collect. -> Option AQuick Check:
unicode-segmentation crate handles grapheme reversal correctly [OK]
- Reversing by chars() breaks multi-codepoint characters
- Reversing bytes corrupts UTF-8 encoding
- Reversing words instead of characters
Ready to prove it?
Pass the test and this pattern moves unknown
