ys memos

Blog

[Rust]LeetCode 535 Encode And Decode Tinyurl


rust

2022/04/23

Rust 版


TinyURL のような短縮 URL のシステムをデザインする問題

今回,Rust を使ってシンプルな解答を作ってみました.特に,『短縮』という点にはこだわらず,要件を満たせるような実装に挑戦してみます.


main.rs
struct Codec {
  urls: Vec<String>,
}

impl Codec {
  fn new() -> Self {
    Self { urls: vec![] }
  }

  fn encode(&mut self, longURL: String) -> String {
    self.urls.push(longURL);
    (self.urls.len() - 1).to_string()
  }

  fn decode(&self, shortURL: String) -> String {
    let n = shortURL.parse::<usize>().unwrap();
    self.urls[n].clone()
  }
}


生成した短縮 URL を記録するurlsを準備する.

ここでは,/0ではurls[0]を,/1ではurls[1]を割り当てられるものとする.

struct Codec {
  urls: Vec<String>,
}

urlsの初期化もココで行う.

impl Codec {
  fn new() -> Self {
    Self { urls: vec![] }
  }

入力された文字列をurlsの末尾に追加し,追加された位置のインデックス番号を文字列として返す.

  fn encode(&mut self, longURL: String) -> String {
    self.urls.push(longURL);
    (self.urls.len() - 1).to_string()
  }

受け取ったshortURLusize型にパースし,そのインデックスに登録されている URL をurlsから取り出し,それを返す.

  fn decode(&self, shortURL: String) -> String {
    let n = shortURL.parse::<usize>().unwrap();
    self.urls[n].clone()
  }
}

struct 内の配列からstd::string::Stringを返す時に.clone()が必要なのが,難しかった.

今回の実装では,短縮 URL は数値のみしか持たず,URL の登録数に対して文字列帳が長くなりやすい.

そこで,本来はa-zおよびA-Z等も含める形にする必要がある.


関連タグを探す