📖 Scenario: Imagine you are building a simple text analyzer that finds the first letter in a word that does not repeat. This can help in games or puzzles where unique letters matter.
🎯 Goal: You will write a Rust program that finds the first non-repeating character in a given string using a hash map.
📋 What You'll Learn
Create a string variable with a specific word
Create a hash map to count character occurrences
Use a loop to fill the hash map with counts
Find and print the first character that appears only once
💡 Why This Matters
🌍 Real World
Finding unique characters is useful in text analysis, cryptography, and puzzle games.
💼 Career
Understanding hash maps and string processing is important for software developers working with data parsing and algorithms.
Progress0 / 4 steps
1
Create the input string
Create a variable called input and set it to the string "swiss".
DSA Rust
Hint
Use let input = "swiss"; to create the string.
2
Create a hash map to count characters
Add a mutable HashMap called counts to count characters. Import std::collections::HashMap at the top.
DSA Rust
Hint
Use let mut counts = HashMap::new(); to create the map.
3
Count each character in the string
Use a for loop with ch to iterate over input.chars(). For each ch, update counts by increasing its count by 1.
DSA Rust
Hint
Use for ch in input.chars() and *counts.entry(ch).or_insert(0) += 1;.
4
Find and print the first non-repeating character
Use a for loop with ch to iterate over input.chars(). Inside the loop, check if counts[&ch] equals 1. If yes, print ch and break the loop.
DSA Rust
Hint
Use if counts[&ch] == 1 then println!("{}", ch); and break;.
Practice
(1/5)
1. What is the main purpose of using a hash map when finding the first non-repeating character in a string?
easy
A. To sort the characters alphabetically
B. To store the frequency of each character for quick lookup
C. To reverse the string efficiently
D. To convert characters to uppercase
Solution
Step 1: Understand the role of hash map
A hash map stores each character as a key and its count as the value, allowing quick frequency lookup.
Step 2: Why frequency matters
Knowing frequency helps identify which character appears only once, the first non-repeating character.
Final Answer:
To store the frequency of each character for quick lookup -> Option B
Quick Check:
Hash map = frequency storage [OK]
Hint: Use hash map to count characters fast [OK]
Common Mistakes:
Thinking hash map sorts characters
Using hash map to reverse string
Ignoring frequency counts
2. Which Rust data structure is best suited to implement the frequency count for characters in a string?
easy
A. HashMap
B. Vec<char>
C. String
D. Option<char>
Solution
Step 1: Identify data structure for key-value pairs
HashMap stores characters as keys and their counts as values, perfect for frequency counting.
Step 2: Why others don't fit
Vec<char> is just a list, String holds characters but no counts, Option<char> holds one optional char only.
Final Answer:
HashMap -> Option A
Quick Check:
HashMap = char to count map [OK]
Hint: Use HashMap for frequency counts [OK]
Common Mistakes:
Using Vec instead of HashMap
Confusing String with frequency map
Using Option for multiple counts
3. What will be the output of the following Rust code snippet?
use std::collections::HashMap;
fn first_non_repeating(s: &str) -> Option<char> {
let mut counts = HashMap::new();
for c in s.chars() {
*counts.entry(c).or_insert(0) += 1;
}
for c in s.chars() {
if counts[&c] == 1 {
return Some(c);
}
}
None
}
fn main() {
let result = first_non_repeating("swiss");
println!("{:?}", result);
}
medium
A. Some('s')
B. None
C. Some('i')
D. Some('w')
Solution
Step 1: Count character frequencies in "swiss"
's' appears 3 times, 'w' once, 'i' once.
Step 2: Find first character with count 1 in original order
Order: 's'(3), 'w'(1), 'i'(1), 's'(3), 's'(3). First with count 1 is 'w'.
Final Answer:
Some('w') -> Option D
Quick Check:
First unique char = 'w' [OK]
Hint: Check counts then first unique char in order [OK]
Common Mistakes:
Picking first char without checking count
Confusing 'i' and 'w' positions
Ignoring multiple occurrences
4. Identify the bug in this Rust function to find the first non-repeating character:
fn first_non_repeating(s: &str) -> Option<char> {
let mut counts = std::collections::HashMap::new();
for c in s.chars() {
counts.insert(c, 1);
}
for c in s.chars() {
if counts[&c] == 1 {
return Some(c);
}
}
None
}
medium
A. Using insert overwrites counts, so frequencies are incorrect
B. Missing return type Option<char>
C. Using s.chars() instead of s.bytes()
D. No bug, code works correctly
Solution
Step 1: Analyze frequency counting loop
Using counts.insert(c, 1) overwrites previous counts, so frequency is always 1.
Step 2: Effect on result
All characters appear counted as 1, so function returns first char incorrectly.
Final Answer:
Using insert overwrites counts, so frequencies are incorrect -> Option A
Quick Check:
insert overwrites count, use entry().or_insert() [OK]
Hint: Use entry().or_insert() to update counts [OK]
Common Mistakes:
Using insert instead of entry().or_insert()
Ignoring frequency updates
Confusing chars and bytes
5. Given a string that may contain Unicode characters, how would you modify the Rust function to correctly find the first non-repeating character considering Unicode graphemes instead of chars?
Choose the best approach.
hard
A. Use chars() iterator as usual, it handles graphemes correctly
B. Convert string to bytes and count byte frequencies
C. Use the unicode-segmentation crate to iterate over graphemes and count frequencies
D. Replace all Unicode characters with ASCII equivalents before counting