Java
rust

プログラミング力を鍛える本にRustで挑戦する[問題1.4]

問題

回文の順列

  • 与えられた文字列が回文の順列か調べる
  • 回文の順列である文字列とは、与えられた文字列を並び替えた時に回文にすることが可能である文字列のこと

回答

fn is_palindrome(s: &str) -> bool {
    let mut map: HashMap<char, i32> = HashMap::new();
    for ch in s.chars() {
        *map.entry(ch).or_insert(0) += 1;
    }
    let cnt = map.values()
        .filter(|val| *val % 2 == 1)
        .count();
    cnt == s.chars().count() % 2
}

こんな感じにかいてみました。
各文字の出現回数を数えて偶数文字ならすべての文字の出現回数が0であればいい。
逆に奇数なら出現回数が奇数の物が一つだけあるといい。
mapのentry()はJavaのmap.get()より使いやすくていいですね。
filterのところの書き方で少し引っかかったけどおおむね綺麗に書けました。

Javaで書くとこうなるので大体同じですかね。

boolean isPalindrome(String str) {
    Map<Character, Integer> map = new HashMap<>();
    for(char ch : str.toCharArray()) {
        map.put(ch, map.getOrDefault(ch, 0) + 1);
    }
    long cnt = map.entrySet().stream()
        .filter(e -> e.getValue() % 2 == 1)
        .count();
    return cnt == str.length() % 2;
}

ちなみにこれを書いてて初めてgetOrDefault()というものがあることに気づきました。