刪括號(牛客)

2021-10-22 17:45:34 字數 1661 閱讀 9375

題目描述

給你乙個合法的括號序列s1,每次你可以刪除乙個"()"

你可以刪除0個或者多個"()"

求能否刪成另乙個括號序列s2

輸入描述:

第一行輸入乙個字串s (2 ≤ |s| ≤ 100)

第二行輸入乙個字串t (2 ≤ |t| ≤ 100 )

輸出描述:

如果可以輸出"possible"

否則輸出"impossible"

示例1輸入

複製(())

()輸出

複製possible

示例2輸入

複製()

()輸出

複製possible

示例3輸入

複製(()()())

((()))

輸出複製

impossible

示例4輸入

複製((())((())())())

(()(())())

輸出複製

possible

示例5輸入

複製((())((())())())

((()()()()()))

輸出複製

impossible

備註:子任務1: |s| <= 10

子任務2: |s| <= 20

子任務3: 無限制

我們先談談簡單的思路,最內層的迴圈是為了找到乙個e使s能夠刪除e個『( 』 能與t匹配【e = 『(』 - 『)』 的數目】,所謂的匹配就是s和t相差n個();知道了這個以後我們就要對s和t進行動態維護;

我們先假定t 取前i項不動,對s進行動態處理,每次都增加s的一項,我們要判斷s的前j項和t的前i項能否通過處理e值來匹配,如果可以我們就稱之為可能達到目標的狀態,我們要用動態方程1

if(s[q+1]==』(』 ) dp[q+1][w][e+1]=true;

else if(k) dp[q+1][w][e-1]=true;

隨後我們要變動t,每次增一下,當然這種增加也不是隨便能增的,我們必須在上面所說的狀態為true時判斷,其中是否有一種情況能滿足e=0,且s[q+1]=t[w+1]?為什麼這樣做就是對的呢,我們回到我們剛剛開頭的地方,當dp[0][0][0]=true時對於s[q+1]和t[w+1]而言他們滿足我們上述所說的方程,我們每動一次t就是不斷擴大我們的子問題,保證在t增加的時候我們當前獲得的s,t子串能夠能夠通過刪除n個()來匹配;這裡我們就明白了,該題題意所要求問題的解答的一般情況是s刪n個()能與t匹配,想想是不是。

所以我們通過這三個判斷式能獲得所有的一般解,當然滿足s和t是括號序列的特殊情況就包含在內了;

以下是**提供參考

//注意dp[q][w][e]=true是指s前q項與t前w項能通過刪除e個多餘 '( '實現匹配;所以我們輸入時一定要注意 從陣列第1項開始輸入,切記不要從0項開始輸入,因為s[0]是s的第一項,而dp[0]表示s的前0項…;

#include

using

namespace std;

intmain()

}}}if

(dp[len1]

[len2][0

]) cout<<

"possible"

"impossible"

}

牛客 刪括號

給你乙個合法的括號序列s1,每次你可以刪除乙個 你可以刪除0個或者多個 求能否刪成另乙個括號序列s2 第一行輸入乙個字串s 2 s 100 第二行輸入乙個字串t 2 t 100 如果可以輸出 possible 否則輸出 impossible possible possible impossible ...

牛客 21303 刪括號

給你乙個合法的括號序列s1,每次你可以刪除乙個 你可以刪除0個或者多個 求能否刪成另乙個括號序列s2 第一行輸入乙個字串s 2 s 100 第二行輸入乙個字串t 2 t 100 如果可以輸出 possible 否則輸出 impossible possible possible impossible ...

牛客網 刪數

有乙個陣列a n 順序存放0 n 1,要求每隔兩個數刪掉乙個數,到末尾時迴圈至開頭繼續進行,求最後乙個被刪掉的數的原始下標位置。以8個數 n 7 為例 0,1,2,3,4,5,6,7 0 1 2 刪除 3 4 5 刪除 6 7 0 刪除 如此迴圈直到最後乙個數被刪除。輸入描述 每組資料為一行乙個整數...