20240509 Finished
This commit is contained in:
parent
7f7f30b76f
commit
e54e03c4f3
|
@ -126,3 +126,4 @@ mod p383_ransom_note;
|
||||||
mod p290_word_pattern;
|
mod p290_word_pattern;
|
||||||
mod p205_isomorphic_strings;
|
mod p205_isomorphic_strings;
|
||||||
mod p242_valid_anagram;
|
mod p242_valid_anagram;
|
||||||
|
mod p49_group_anagrams;
|
107
src/problem/p49_group_anagrams.rs
Normal file
107
src/problem/p49_group_anagrams.rs
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
/**
|
||||||
|
* [49] Group Anagrams
|
||||||
|
*/
|
||||||
|
pub struct Solution {}
|
||||||
|
|
||||||
|
// submission codes start here
|
||||||
|
use std::{collections::HashMap, hash::Hash};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct WordState {
|
||||||
|
characters: HashMap<char, usize>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialEq for WordState {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
if self.characters.len() != other.characters.len() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (c, &v) in self.characters.iter() {
|
||||||
|
match other.characters.get(c) {
|
||||||
|
Some(other_v) => {
|
||||||
|
if *other_v != v {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Eq for WordState {}
|
||||||
|
|
||||||
|
impl Hash for WordState {
|
||||||
|
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
|
||||||
|
let mut chars: Vec<(&char, &usize)> =
|
||||||
|
self.characters.iter().map(|p| p).collect();
|
||||||
|
|
||||||
|
chars.sort_by_key(|p| p.0);
|
||||||
|
|
||||||
|
for (&c, &v) in chars {
|
||||||
|
c.hash(state);
|
||||||
|
v.hash(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Solution {
|
||||||
|
pub fn group_anagrams(strs: Vec<String>) -> Vec<Vec<String>> {
|
||||||
|
let mut result = HashMap::with_capacity(strs.len());
|
||||||
|
|
||||||
|
for word in strs {
|
||||||
|
let mut characters = HashMap::with_capacity(26);
|
||||||
|
|
||||||
|
for c in word.chars() {
|
||||||
|
let entry = characters.entry(c).or_insert(0);
|
||||||
|
*entry += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
let state = WordState { characters };
|
||||||
|
dbg!(&state);
|
||||||
|
let entry = result.entry(state).or_insert(vec![]);
|
||||||
|
entry.push(word);
|
||||||
|
}
|
||||||
|
|
||||||
|
result.into_values().collect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// submission codes end
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_49() {
|
||||||
|
assert_eq!(
|
||||||
|
WordState {
|
||||||
|
characters: HashMap::from([('e', 1), ('a', 1), ('t', 1)])
|
||||||
|
},
|
||||||
|
WordState {
|
||||||
|
characters: HashMap::from([('a', 1), ('t', 1), ('e', 1)])
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
vec![
|
||||||
|
vec!["bat".to_owned()],
|
||||||
|
vec!["nat".to_owned(), "tan".to_owned()],
|
||||||
|
vec!["ate".to_owned(), "eat".to_owned(), "tea".to_owned()]
|
||||||
|
],
|
||||||
|
Solution::group_anagrams(vec![
|
||||||
|
"eat".to_owned(),
|
||||||
|
"tea".to_owned(),
|
||||||
|
"tan".to_owned(),
|
||||||
|
"ate".to_owned(),
|
||||||
|
"nat".to_owned(),
|
||||||
|
"bat".to_owned()
|
||||||
|
])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user