楼主:
yam276 ('_')
2025-06-10 16:06:001657. Determine if Two Strings Are Close
题目:
你可以用两种操作
1. 随意更换字符顺序
2. 把字串内两种符号种类对换
看能不能用他们把两个字串变成一样的
思路:
操作一其实没意思 不用考虑 因为操作次数无限
重点还是操作二
操作二这样写
代表只要两个字串的字符 freq 一样
字符种类也一样 没有一个有一个没有的
就可以变换
最简单的方法
可以用 HashMap 蒐集次数
用 HashSet 比较字母
用 Vec sort 比较 freq
但这样时间复杂度不够高
更高的还是创 26 大小字母阵列来解
Code:
use std::collections::{HashMap, HashSet};
impl Solution {
pub fn close_strings(word1: String, word2: String) -> bool {
let mut freq1 = HashMap::new();
let mut freq2 = HashMap::new();
for c in word1.chars() {
*freq1.entry(c).or_insert(0) += 1;
}
for c in word2.chars() {
*freq2.entry(c).or_insert(0) += 1;
}
let set1: HashSet<_> = freq1.keys().cloned().collect();
let set2: HashSet<_> = freq2.keys().cloned().collect();
if set1 != set2 {
return false;
}
let mut count1: Vec<_> = freq1.values().cloned().collect();
let mut count2: Vec<_> = freq2.values().cloned().collect();
count1.sort();
count2.sort();
if count1 != count2 {
return false;
}
true
}
}
26 字符阵列版:
impl Solution {
pub fn close_strings(word1: String, word2: String) -> bool {
let mut count1 = [0; 26];
let mut count2 = [0; 26];
let mut set1 = [false; 26];
let mut set2 = [false; 26];
for c in word1.chars() {
let i = (c as u8 - b'a') as usize;
count1[i] += 1;
set1[i] = true;
}
for c in word2.chars() {
let i = (c as u8 - b'a') as usize;
count2[i] += 1;
set2[i] = true;
}
if set1 != set2 {
return false;
}
let mut freq1: Vec<_> = count1.iter()
.filter(|&&x| x > 0)
.cloned().collect();
let mut freq2: Vec<_> = count2.iter()
.filter(|&&x| x > 0)
.cloned().collect();
freq1.sort();
freq2.sort();
freq1 == freq2
}
}