1713. 得到子串行的最少操作次數給你乙個陣列 target ,包含若干 互不相同 的整數,以及另乙個整數陣列 arr ,arr 可能 包含重複元素。
每一次操作中,你可以在 arr 的任意位置插入任一整數。比方說,如果 arr = [1,4,1,2] ,那麼你可以在中間新增 3 得到 [1,4,3,1,2] 。你可以在陣列最開始或最後面新增整數。
請你返回 最少 操作次數,使得 target 成為 arr 的乙個子串行。
乙個陣列的 子串行 指的是刪除原陣列的某些元素(可能乙個元素都不刪除),同時不改變其餘元素的相對順序得到的陣列。比方說,[2,7,4] 是 [4,2,3,7,2,1,4] 的子串行(加粗元素),但 [2,4,2] 不是子串行。
示例 1:
輸入:target = [5,1,3], arr = [9,4,2,3,4]
輸出:2
解釋:你可以新增 5 和 1 ,使得 arr 變為 [5,9,4,1,2,3,4] ,target 為 arr 的子串行。
示例 2:
輸入:target = [6,4,8,1,3,2], arr = [4,7,6,2,3,8,6,1]
輸出:3
1 <= target.length, arr.length <= 105
1 <= target[i], arr[i] <= 109
target 不包含任何重複元素。
通過次數1,445提交次數3,140
解析:
ans=len(a)-lcs(a,b),lcs:最長公共子串行
def minoperations1(target, arr):
m, n = len(target), len(arr)
dp = [[0] * (n+1) for _ in range(m+1)]
for i in range(1, m+1):
for j in range(1, n+1):
dp[i][j] = max([dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1] + int(target[i-1] == arr[j-1])])
return len(target) - dp[m][n]
target = [6,4,8,1,3,2], arr = [4,7,6,2,3,8,6,1]
將target 轉換成序號:[0,1,2,3,4,5]
arr相應數字也進行替換:[1,0,5,4,2,0,3],沒有的刪除
由於target序號一定是遞增序列,因此本題可以轉換成尋找-最長單調遞增子串行,參見:300. 最長遞增子串行
複雜度:o(n)
def minoperations2(target, arr):
def lis(a) -> int:
dp =
for x in a:
if not dp or x > dp[-1]:
else:
dp[bisect_left(dp, x)] = x
return len(dp)
map_set =
new_arr = [map_set.get(x) for x in arr if x in map_set]
return len(target) - lis(new_arr)
1713最長同號連續段
最長同號連續段 time limit 1 seconds memory limit 32768 k total submit 447 accepted 179 description 給出乙個由非0整數組成的序列a1,a2,an,設計遞迴演算法求其中由同號整數組成的最長連續段 稱為最長同號連續段 的...
leetcode面試題 17 13 恢復空格
哦,不!你不小心把乙個長篇文章中的空格 標點都刪掉了,並且大寫也弄成了小寫。像句子 i reset the computer.it still didn t boot 已經變成了 iresetthecomputeritstilldidntboot 在處理標點符號和大小寫之前,你得先把它斷成詞語。當然...
Leetcode139 單詞拆分(動態規劃,遞迴)
重點1 判斷字串s是否在list中,即實現類似python中in方法 將list轉為set,然後用set的contains方法 list轉set setset new hashset worddict 實現 1 public boolean check string s,listworddict 解...