2022/04/23
はじめに
入力された文字列の配列の各文字列をモールス信号に変換して結合した信号が,何種類あるのかを求める問題.
今回は,Rust を用いて,シンプルな解法を作ってみた.
コード全文
main.rs
use std::collections::HashSet;
const morse: &[&str] = &[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."];
fn to_index(b: u8) -> usize {
(b as usize) - 97
}
fn transform(word: String) -> String {
let mut series = String::new();
for b in word.bytes() {
let i = to_index(b);
series.push_str(&morse[i].to_string());
}
series
}
impl Solution {
pub fn unique_morse_representations(words: Vec<String>) -> i32 {
let mut set: HashSet<String> = HashSet::new();
for word in words {
let series = transform(word);
set.insert(series);
}
set.len() as i32
}
}
解説
ライブラリの準備
use std::collections::HashSet;
変換用定数
文字列→モールス信号
への変換のためには,アルファベット・モールス符号対応表が必要となる.
これは,問題分で提示されているので,それをコピーしてきて,配列として準備する.
'a'
の場合は0
番目,'b'
の場合は1
番目といったように対応している.
const morse: &[&str] = &[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."];
アルファベットの番号を返す関数
これは,morse
の何番目を用いればよいのかを求めるために使う.
fn to_index(b: u8) -> usize {
(b as usize) - 97
}
モールス信号への変換用関数
予め定義したmorse
の,アルファベットの番号の信号を接続し,series
を作成し,戻り値として返す.
fn transform(word: String) -> String {
let mut series = String::new();
for b in word.bytes() {
let i = to_index(b);
series.push_str(&morse[i].to_string());
}
series
}
呼び出し用関数
ここで,モールス信号の種類をカウントするためのHashSet
を初期化しておく.
impl Solution {
pub fn unique_morse_representations(words: Vec<String>) -> i32 {
let mut set: HashSet<String> = HashSet::new();
各 word のモールス信号を Set に追加
この際,重複の有無に関わらずHashSet
のキーの有無としてカウントされるため,題意を満たす.
for word in words {
let series = transform(word);
set.insert(series);
}
Set の要素数を返す
set.len() as i32
}
}
おわりに
Rust を勉強中のため,一問解くために(思考をコード化するために)リファレンスや StackOverflow 等を調べる必要があり,かなり時間がかかってしまう・・・
しかし,頭が活性化している感覚が楽しいですね 😄
参考
- https://doc.rust-lang.org/std/collectionsstruct.HashSet.html
- https://doc.rust-lang.org/std/stringstruct.String.html
- https://www.rapidtables.com/code/text/asciiascii-a.html
- https://stackoverflow.com/questions/22118221how-do-you-iterate-over-a-string-by-character
- https://users.rust-lang.org/t/declaring-a-global-vector-in-rust/725112