This commit is contained in:
Rorik Star Platinum 2025-12-04 15:38:26 +03:00
parent 62d1558abe
commit 498f64b5cd
3 changed files with 35 additions and 24 deletions

View file

@ -1,8 +1,36 @@
use std::collections::HashSet;
use std::collections::{HashMap, HashSet};
pub fn anagrams_for<'a>(
word: &str,
possible_anagrams: &[&str]
) -> HashSet<&'a str> {
todo!("For the '{word}' word find anagrams among the following words: {possible_anagrams:?}");
pub trait CharCounter {
fn get_chars_frequency(&self) -> HashMap<char, usize>;
}
pub trait AnagramsFinder<'a> {
fn find_anagrams(&self, pattern_raw: &str) -> HashSet<&'a str>;
}
impl CharCounter for str {
fn get_chars_frequency(&self) -> HashMap<char, usize> {
self.chars().fold(HashMap::new(), |mut acc, c| {
*acc.entry(c).or_insert(0) += 1;
acc
})
}
}
impl<'a> AnagramsFinder<'a> for [&'a str] {
fn find_anagrams(&self, pattern_raw: &str) -> HashSet<&'a str> {
let pattern = pattern_raw.to_lowercase();
let pattern_map: HashMap<char, usize> = pattern.get_chars_frequency();
self.iter()
.copied()
.filter(|word_raw| {
let word = word_raw.to_lowercase();
word != pattern && word.get_chars_frequency() == pattern_map
})
.collect()
}
}
pub fn anagrams_for<'a>(word: &str, possible_anagrams: &[&'a str]) -> HashSet<&'a str> {
possible_anagrams.find_anagrams(word)
}