optimization

class Solution:
    def canFormArray(self, arr: List[int], pieces: List[List[int]]) -> bool:
        """ tc O(len(pieces) + len(arr) )  sc O(len(pieces))
        main idea: since both arr and pieces are distinct, we can use first element in one pieces[i] as key and check if we can comcate pieces[i] into arr[j:len(p[i])]
        """
        d  = {p[0]: p for p in pieces}
        concate = []
        i = 0 
        while i < len(arr):
            a = arr[i]
            if a in d:
                len_p = len(d[a])
                if arr[i:i+len_p] != d[a]:
                    return False 
                i = i+len_p
            else: return False 
        return True

original solution

class Solution:
    def canFormArray(self, arr: List[int], pieces: List[List[int]]) -> bool:
        """ tc O(len(pieces) + len(arr) )  sc O(len(pieces))
        main idea: since both arr and pieces are distinct, we can use first element in one pieces[i] as key and check if we can comcate pieces[i] into arr[j:len(p[i])]
        """
        d  = {p[0]: p for p in pieces}
        concate = []
        for a in arr:
            if a in d:
                concate += d[a]
        return arr == concate