Поиск каждого элемента иголки в стоге сена по порядку. Каждый раз, когда вы найдете соответствующий элемент, продолжайте поиск только в оставшейся части стога сена. Вы можете express это красиво сделать, взяв новый подрезок стога сена каждый раз, когда вы сопоставляете элемент.
fn is_subsequence<T: PartialEq>(needle: &[T], mut haystack: &[T]) -> bool {
for search in needle {
if let Some(index) = haystack.iter().position(|el| search == el) {
haystack = &haystack[index + 1..];
} else {
return false;
}
}
true
}
assert!(is_subsequence(b"", b"0123456789"));
assert!(is_subsequence(b"0", b"0123456789"));
assert!(is_subsequence(b"059", b"0123456789"));
assert!(is_subsequence(b"345", b"0123456789"));
assert!(is_subsequence(b"0123456789", b"0123456789"));
assert!(!is_subsequence(b"335", b"0123456789"));
assert!(!is_subsequence(b"543", b"0123456789"));
Срез - это просто указатель и размер, хранящиеся в стеке, так что это нет новых распределений. Он запускается за O(n)
времени и должен быть близок к максимально быстрой реализации - или, по крайней мере, на том же этапе.