1002. Find Common Characters solved in rust
Link
Problem
The problem is asking to find the common characters that are present in all the strings in the given array. The common characters are the characters that are present in all the strings.
Example
Input: ["bella","label","roller"]
Output: ["e","l","l"]
Key
The key to solving this problem is to count the frequency of each character in each string and find the minimum frequency of each character across all strings.
Solution
pub struct Solution;
impl Solution {
pub fn common_chars(words: Vec<String>) -> Vec<String> {
let mut result = vec![];
let mut min_freq = [std::usize::MAX; 26]; // Initialize with maximum value
// For each word, calculate the frequency of each letter
for word in words.iter() {
let mut freq = [0; 26];
for byte in word.as_bytes() {
let char_idx = (byte - 'a' as u8) as usize;
freq[char_idx] += 1;
}
// Update the minimum frequency for each letter
for i in 0..26 {
min_freq[i] = min_freq[i].min(freq[i]);
}
}
// For each letter, if its minimum frequency is more than 0, add it to the result
for letter_idx in 0..26 {
for _ in 0..min_freq[letter_idx] {
result.push(((letter_idx as u8 + 'a' as u8) as char).to_string())
}
}
result
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let scenarios = vec![
(
vec![
"bella".to_string(),
"label".to_string(),
"roller".to_string(),
],
vec!["e".to_string(), "l".to_string(), "l".to_string()],
),
(
vec!["cool".to_string(), "lock".to_string(), "cook".to_string()],
vec!["c".to_string(), "o".to_string()],
),
];
scenarios
.into_iter()
.enumerate()
.for_each(|(idx, (input, expected))| {
let result = Solution::common_chars(input);
assert_eq!(result, expected);
println!(" ✓ scenario {}", idx + 1)
});
}
}
I hope that this article was helpful. If you like it, please share it with your friends and leave a comment; I will gladly answer all the questions.