题目
给你一个整数数组 arr ,数组中的每个整数 互不相同 。另有一个由整数数组构成的数组 pieces,其中的整数也 互不相同 。请你以 任意顺序 连接 pieces 中的数组以形成 arr 。但是,不允许 对每个数组 pieces[i] 中的整数重新排序。
如果可以连接 pieces 中的数组形成 arr ,返回 true ;否则,返回 false 。
示例
示例 1:
输入:arr = [15,88], pieces = [[88],[15]]
输出:true
解释:依次连接 [15] 和 [88]
示例 2:
输入:arr = [49,18,16], pieces = [[16,18,49]]
输出:false
解释:即便数字相符,也不能重新排列 pieces[0]
示例 3:
输入:arr = [91,4,64,78],
pieces = [[78],[4,64],[91]]
输出:true 解释:依次连接 [91]、[4,64] 和 [78]
提示:
1 <= pieces.length <= arr.length <= 100
sum(pieces[i].length) == arr.length
1 <= pieces[i].length <= arr.length
1 <= arr[i], pieces[i][j] <= 100
arr 中的整数 互不相同
pieces 中的整数 互不相同(也就是说,如果将 pieces 扁平化成一维数组,数组中的所有整数互不相同)
思路
index表示arr的下标指针,暴力搜索每个pieces中的开头,如果相等则设另一指针指向pieces中的这个元素,二者同时向后比,比到末尾二者都相等时,index变为index+这个元素的长度,重复即可。这里需要建立哈希表来去重,pieces中的下标如果记录过,那么将直接跳过,不再判断,全部比较完成后即可返回True。如果扫描过一遍pieces发现没有开头元素等于arr[index],则直接返回False
题解
class Solution: def canFormArray(self, arr: List[int], pieces: List[List[int]]) -> bool: # arr下标,哈希表去重 index, tmp = 0, set() while index <= len(arr)-1: # 记录当前下标index,如果比较一遍pieces之后不变则直接返回 tmp_index = index for i in range(len(pieces)): # 为判断过 if i not in tmp: if arr[index] == pieces[i][0]: judge = True index_ = index # 双指针判断是否全部相等 for j in range(1, len(pieces[i])): index_ = index + j if arr[index_] == pieces[i][j]: continue else: judge = False break # 修改index,加入哈希表 if judge: tmp.add(i) index = index_ + 1 # index不变,直接返回 if tmp_index == index: return False return True