sublist
This commit is contained in:
parent
d3bfaf4131
commit
a1afa1e16b
7 changed files with 396 additions and 0 deletions
40
rust/sublist/src/lib.rs
Normal file
40
rust/sublist/src/lib.rs
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub enum Comparison {
|
||||
Equal,
|
||||
Sublist,
|
||||
Superlist,
|
||||
Unequal,
|
||||
}
|
||||
|
||||
trait SublistSearcher<T> {
|
||||
fn contains_slice(&self, sublist: &[T]) -> bool;
|
||||
}
|
||||
|
||||
impl<T> SublistSearcher<T> for [T]
|
||||
where
|
||||
T: PartialEq,
|
||||
{
|
||||
fn contains_slice(&self, sublist: &[T]) -> bool {
|
||||
self.is_empty() && sublist.is_empty()
|
||||
|| (!sublist.is_empty() && self.windows(sublist.len()).any(|x| x == sublist))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn sublist(first_list: &[i32], second_list: &[i32]) -> Comparison {
|
||||
match (first_list.len(), second_list.len()) {
|
||||
(len_1, len_2) if len_1 == len_2 && first_list == second_list => Comparison::Equal,
|
||||
(len_1, len_2)
|
||||
if second_list.is_empty() && !first_list.is_empty()
|
||||
|| (len_1 > len_2 && first_list.contains_slice(second_list)) =>
|
||||
{
|
||||
Comparison::Superlist
|
||||
}
|
||||
(len_1, len_2)
|
||||
if first_list.is_empty() && !second_list.is_empty()
|
||||
|| (len_1 < len_2 && second_list.contains_slice(first_list)) =>
|
||||
{
|
||||
Comparison::Sublist
|
||||
}
|
||||
_ => Comparison::Unequal,
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue