242. 有效的字母异位词

题目描述

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

解题思路

#![allow(unused)]

fn main() {
struct Solution {}
impl Solution {
    pub fn is_anagram(s: String, t: String) -> bool {
        use std::collections::HashMap;
        if s.len() != t.len() { return false }
        let mut freq: HashMap<char, usize> = HashMap::new();
        for c in s.chars() {
            *freq.entry(c).or_default() += 1;
        }
        for c in t.chars() {
            let entry = freq.entry(c).or_default();
            if *entry == 0 { return false }
            *entry -= 1;
        }
        true
    }
}

}

学习感想

Rust 一个char的大小永远就是4字节,在&str里,永远都是utf8编码的,但是占用的长度可能是1-4个字节

Sequences: Vec, VecDeque, LinkedList Maps: HashMap, BTreeMap Sets: HashSet, BTreeSet Misc: BinaryHeap

Borrow 的一个常见应用场景是 HashMap 之类的容器类型。在 HashMap 中,可以用 Borrow 来允许使用不同但兼容的类型进行查找或删除操作。比如,HashMap<String, V> 可以接受 &str 作为键,因为 String 实现了 Borrow

impl 块 在 Rust 中是全局可见的,因为它定义了类型的行为,Rust 需要确保这些行为在整个程序中保持一致。 use 语句 只在局部可见,这样可以避免命名冲突,并且保持模块系统的封装性和灵活性。

#![allow(unused)]
fn main() {
struct Solution {}
impl Solution {
    pub fn is_anagram(s: String, t: String) -> bool {
        use std::collections::HashMap;
        let mut m: HashMap<char, usize> = HashMap::new();
        for ch in s.chars() {
            m.entry(ch).and_modify(|x| *x += 1usize).or_insert(1usize);
        }
        for ch in t.chars() {
            use std::collections::hash_map::Entry;
            match m.entry(ch) {
                Entry::Occupied(mut o) => {
                    let x: &mut usize = o.get_mut();
                    *x -= 1usize;
                    if *x == 0usize { o.remove(); }
                },
                Entry::Vacant(_) => { return false },
            }
        }
        m.len() == 0
    }
}
}