LeetCode Rust - 242 - 有效的字母异位词

原题:242. 有效的字母异位词 - 力扣(LeetCode)

解一,哈希表

用两个哈希表分别记录两个字符串中各字符出现的次数,最后遍历较长的字符串,对比两个哈希表中字符出现的次数

pub fn is_anagram(s: String, t: String) -> bool {
	use std::collections::HashMap;
	let mut s_map = HashMap::<char, u32>::new();
	let mut t_map = HashMap::<char, u32>::new();
	
	for mut item in [(s, &mut s_map), (t, &mut t_map)] {
		for char in item.0.chars() {
			let count = item.1.entry(char).or_insert(0);
			*count += 1;
		}
	}

	let mut maps = if s_map.len() > t_map.len() {
		(s_map, t_map)
	} else {
		(t_map, s_map)
	};

	for (char, count) in maps.0 {
		if *(maps.1.entry(char).or_insert(0)) != count {
			return false;
		}
	}

	return true;
}

时间:$O(2n + m)$ 空间:$O(n + m)$

解二,哈希表(优化版)

[[ #解一,哈希表 ]] 中使用了两个哈希表,空间和时间上都还能再优化

这边使用一个数组来替代这两个哈希表

  • 如果两字符串长度不等,返回 false
  • 题目中只有小写字母,声明长度为 26 的数组,hash_arr
  • 遍历第一个字符串,对每个字符 char
    • hash_arr[char - 'a'] 自增
  • 遍历第二个字符串,对每个字符 char
    • 如果 hash_arr[char - 'a'] 等于零,返回 false
    • 否则 hash_arr[char - 'a'] 自减
pub fn is_anagram(s: String, t: String) -> bool {
	if s.len() != t.len() {
		return false;
	}
	let mut list_arr = [0; 26];
	for char in s.chars() {
		list_arr[char as usize - 'a' as usize] += 1;
	}
	for char in t.chars() {
		let mut count = list_arr.get_mut(char as usize - 'a' as usize).unwrap();
		if *count == 0 {
			return false;
		} else {
			*count -= 1;
		}
	}
	return true;
}

时间:$O(n)$ 空间:$O(1) = O(S)$

$n$ 为单个字符串的长度 $S$ 为字符集大小,题目中为 $S = 26$

解三,排序

将两个字符串排序,然后依次比较

pub fn is_anagram(s: String, t: String) -> bool {
	if s.len() != t.len() {
		return false;
	}
	fn sort_string(target: &String) -> Vec<char> {
		let mut target_to_sort: Vec<char> = target[..].chars().collect();
		target_to_sort.sort();
		return target_to_sort;
	}
	let s_sorted = sort_string(&s);
	let t_sorted = sort_string(&t);
	for (i, char) in s_sorted.iter().enumerate() {
		if *char != t_sorted[i] {
			return false;
		}
	}
	return true;
}

时间:$O(n) = O(n\log_{}{n} + n)$ 空间:$O(\log{}{n})$

$n$ 为单条字符串长度 排序需要 $n\log_{}{n}$ 的时间和 $\log{}{n}$ 的空间

反向链接


图谱

LeetCodeObsidian我的作品技术蓝色协议(日服)FLCL无职转生~到异世界就拿出真本事~混沌武士2023-06-062023-06-102023-06-132023-07-02Antd NoteBookCPU性能天梯图CSS NoteBookGFWIndexedDB 读写地狱JS 事件循环JS 原型链JS 运算符LaTeX NoteBookLeetCode Rust - 1 - 两数之和LeetCode Rust - 122 - 买卖股票的最佳时机 IILeetCode Rust - 125 - 验证回文串LeetCode Rust - 136 - 只出现一次的数字LeetCode Rust - 189 - 轮转数组LeetCode Rust - 217 - 存在重复元素LeetCode Rust - 242 - 有效的字母异位词LeetCode Rust - 26 - 删除有序数组中的重复项LeetCode Rust - 283 - 移动零LeetCode Rust - 344 - 反转字符串LeetCode Rust - 350 - 两个数组的交集 IILeetCode Rust - 36 - 有效的数独LeetCode Rust - 387 - 字符串中的第一个唯一字符LeetCode Rust - 48 - 旋转图像LeetCode Rust - 66 - 加一LeetCode Rust - 7 - 整数反转LeetCode Rust - 8 - 字符串转换整数 (atoi)Rust NoteBookYAMLcargo 配置hugo-obsidian 元数据解析问题safari 移动端适配发布同步国际邮箱安装 mingw显卡性能天梯图注册日本邮箱科学上网第三方插件配置 Ruby 环境🤖Gmail🤖Netch🤖Obsidian Git🤖Outlook🤖Plugin Proxy🤖epub.js🤖pdf.js🤖yuè - Web 阅读器🤖加速器HomeReact18 diff 算法Vue3 diff 算法Vue3 响应式系统Vue3 渲染流程CssMarkdownReactRustViteVueWebpack下载万代南梦宫启动器下载蓝色协议注册万代南梦宫账号🤖setup CliLeetcode originLeetcode time&space