Skip to main content

SequenceExt

Trait SequenceExt 

Source
pub trait SequenceExt<T> {
    // Required methods
    fn is_palindrome<R: RangeBounds<usize>>(&self, range: R) -> bool
       where T: Eq;
    fn reverse_range<R: RangeBounds<usize>>(&mut self, range: R);
    fn rotate_left_range<R: RangeBounds<usize>>(&mut self, range: R, k: usize);
    fn rotate_right_range<R: RangeBounds<usize>>(&mut self, range: R, k: usize);
}
Expand description

列の任意区間に対する操作を提供します。

[T] に実装されているため、Vec<T> や配列のスライスに対して利用できます。

範囲引数は RangeBounds に従い、.., l.., ..r, l..r, l..=r などを指定できます。 範囲は半開区間 [start, end) として扱われます。添字は0始まりで、変換後の範囲が 0 <= start <= end <= self.len() を満たさない場合は panic します。

Required Methods§

Source

fn is_palindrome<R: RangeBounds<usize>>(&self, range: R) -> bool
where T: Eq,

range で指定した区間が回文かどうかを返します。

範囲内の要素を先頭と末尾から順に比較します。空区間と1要素の区間は回文です。 計算量は区間長を L として O(L)、追加メモリは O(1) です。

§Examples
use atcoder::string::SequenceExt;

let a = vec![1, 2, 3, 2, 1];

assert!(a.is_palindrome(..));
assert!(a.is_palindrome(1..4));
assert!(a.is_palindrome(2..3));
assert!(!a.is_palindrome(0..4));
Source

fn reverse_range<R: RangeBounds<usize>>(&mut self, range: R)

range で指定した区間の要素順を反転します。

範囲外の要素は変更しません。空区間では何もしません。 計算量は区間長を L として O(L)、追加メモリは O(1) です。

§Examples
use atcoder::string::SequenceExt;

let mut a = vec![1, 2, 3, 4, 5];
a.reverse_range(1..4);

assert_eq!(a, vec![1, 4, 3, 2, 5]);
Source

fn rotate_left_range<R: RangeBounds<usize>>(&mut self, range: R, k: usize)

range で指定した区間を左に k 個巡回シフトします。

k が区間長以上の場合は、区間長で割った余りだけシフトします。たとえば [1, 2, 3] を k = 1 でシフトすると [2, 3, 1] になります。空区間に対して呼び出した場合は何もしません。

計算量は区間長を L として O(L)、追加メモリは O(1) です。

§Examples
use atcoder::string::SequenceExt;

let mut a = vec![1, 2, 3, 4, 5];
a.rotate_left_range(1..5, 2);

assert_eq!(a, vec![1, 4, 5, 2, 3]);
Source

fn rotate_right_range<R: RangeBounds<usize>>(&mut self, range: R, k: usize)

range で指定した区間を右に k 個巡回シフトします。

k が区間長以上の場合は、区間長で割った余りだけシフトします。たとえば [1, 2, 3] を k = 1 でシフトすると [3, 1, 2] になります。空区間に対して呼び出した場合は何もしません。

計算量は区間長を L として O(L)、追加メモリは O(1) です。

§Examples
use atcoder::string::SequenceExt;

let mut a = vec![1, 2, 3, 4, 5];
a.rotate_right_range(1..5, 2);

assert_eq!(a, vec![1, 4, 5, 2, 3]);

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementations on Foreign Types§

Source§

impl<T> SequenceExt<T> for [T]

Source§

fn is_palindrome<R: RangeBounds<usize>>(&self, range: R) -> bool
where T: Eq,

Source§

fn reverse_range<R: RangeBounds<usize>>(&mut self, range: R)

Source§

fn rotate_left_range<R: RangeBounds<usize>>(&mut self, range: R, k: usize)

Source§

fn rotate_right_range<R: RangeBounds<usize>>(&mut self, range: R, k: usize)

Implementors§