yiskw note

機械学習やプログラミングについて気まぐれで書きます

【Rust】ベクタ型の要素を右/左にシフトさせる rotate_right / rotate_left


はじめに

RustでB - String Shiftingを解くにあたり,
ベクタ型の要素を右 / 左にシフトさせる方法について調べたので,こちらにメモを残しておきます.

ベクタ型の要素を右 / 左にシフトさせる方法

doc.rust-lang.org

こちらに記載のあるrotate_left / rotate_rightメソッドを使用することで,ベクタ型の要素を左右に移動させることができます.

let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
a.rotate_left(2);
assert_eq!(a, ['c', 'd', 'e', 'f', 'a', 'b']);

また,ベクタ型の一部をシフトさせることも可能です.

let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
a[1..5].rotate_left(1);
assert_eq!(a, ['a', 'c', 'd', 'e', 'b', 'f']);

B - String Shiftingの解法

与えられた文字列を 0 ~ (n - 1)回シフトさせたもの全列挙して,別のベクタに保持しておき,ソートして最小と最大を取り出せば良いです.

use proconio::{
    input,
    marker::{Bytes, Chars},
};

fn main() {
    input! {
        mut s: Chars,
    };

    let mut v = vec![];
    for _ in 0..s.len() {
        v.push(s.clone());
        s.rotate_right(1);
    }
    v.sort();
    println!("{}", v[0].iter().collect::<String>());
    println!("{}", v[v.len() - 1].iter().collect::<String>());
}

参考