rs: add “1657. Determine if Two Strings Are Close”
Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
parent
a1de882ad5
commit
52d2e3e7a4
1 changed files with 39 additions and 0 deletions
39
rs/determine-if-two-strings-are-close.rs
Normal file
39
rs/determine-if-two-strings-are-close.rs
Normal file
|
@ -0,0 +1,39 @@
|
|||
use std::convert::TryFrom;
|
||||
|
||||
impl Solution {
|
||||
fn freqs(word: &str) -> Vec<usize> {
|
||||
let mut f = vec![0; 26];
|
||||
|
||||
let zero = u8::try_from('a').unwrap();
|
||||
for c in word.chars().filter_map(|c| match u8::try_from(c) {
|
||||
Ok(val) => Some(val),
|
||||
_ => None,
|
||||
}) {
|
||||
f[(c - zero) as usize] += 1;
|
||||
}
|
||||
|
||||
f
|
||||
}
|
||||
|
||||
fn mask(f: &[usize]) -> i32 {
|
||||
let mut m = 0;
|
||||
|
||||
for c in f {
|
||||
m = (m << 1) | if *c > 0 { 1 } else { 0 };
|
||||
}
|
||||
|
||||
m
|
||||
}
|
||||
|
||||
pub fn close_strings(word1: String, word2: String) -> bool {
|
||||
let mut f1 = Solution::freqs(&word1);
|
||||
let m1 = Solution::mask(&f1);
|
||||
f1.sort();
|
||||
|
||||
let mut f2 = Solution::freqs(&word2);
|
||||
let m2 = Solution::mask(&f2);
|
||||
f2.sort();
|
||||
|
||||
m1 == m2 && f1 == f2
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue