rustgym/leetcode/
_1640_check_array_formation_through_concatenation.rs

1struct Solution;
2
3impl Solution {
4    fn can_form_array(arr: Vec<i32>, pieces: Vec<Vec<i32>>) -> bool {
5        let n = arr.len();
6        Self::dp(n, &arr, &pieces)
7    }
8
9    fn dp(n: usize, arr: &[i32], pieces: &[Vec<i32>]) -> bool {
10        if n == 0 {
11            return true;
12        }
13        for piece in pieces {
14            let m = piece.len();
15            if m <= n && arr[n - m..n] == piece[0..m] && Self::dp(n - m, arr, pieces) {
16                return true;
17            }
18        }
19        false
20    }
21}
22
23#[test]
24fn test() {
25    let arr = vec![85];
26    let pieces = vec_vec_i32![[85]];
27    let res = true;
28    assert_eq!(Solution::can_form_array(arr, pieces), res);
29    let arr = vec![15, 88];
30    let pieces = vec_vec_i32![[88], [15]];
31    let res = true;
32    assert_eq!(Solution::can_form_array(arr, pieces), res);
33    let arr = vec![49, 18, 16];
34    let pieces = vec_vec_i32![[16, 18, 49]];
35    let res = false;
36    assert_eq!(Solution::can_form_array(arr, pieces), res);
37    let arr = vec![91, 4, 64, 78];
38    let pieces = vec_vec_i32![[78], [4, 64], [91]];
39    let res = true;
40    assert_eq!(Solution::can_form_array(arr, pieces), res);
41    let arr = vec![1, 3, 5, 7];
42    let pieces = vec_vec_i32![[2, 4, 6, 8]];
43    let res = false;
44    assert_eq!(Solution::can_form_array(arr, pieces), res);
45}