解一,哈希表
用两个哈希表分别记录两个字符串中各字符出现的次数,最后遍历较长的字符串,对比两个哈希表中字符出现的次数
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;
}
时间: 空间:
解二,哈希表(优化版)
解一,哈希表 中使用了两个哈希表,空间和时间上都还能再优化
这边使用一个数组来替代这两个哈希表
- 如果两字符串长度不等,返回
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;
}
时间: 空间:
为单个字符串的长度 为字符集大小,题目中为
解三,排序
将两个字符串排序,然后依次比较
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;
}
时间: 空间:
为单条字符串长度 排序需要 的时间和 的空间