C The Monster 括號匹配

2021-08-15 04:48:37 字數 1367 閱讀 6295

the monster

題目大意:

給出乙個串,只包含 ( ? ) 三種符號,求出有多少個子串是完美匹配的.

比如

( ) ? )  =>  ( ) ( ) 完美匹配

( ( ) ?=> ( ( ) )完美匹配

? ? ? ?=>

( )( )

=> ( ( ) )

算一種子串

length<5000 ,1000ms

分析:

這個長度和時間限制比較詭異,想不到比較好的方法,猜想應該是在 n2 上的基礎上做一點優化.結果確實是這樣的

列舉兩個端點沒有試過,可能會超時

列舉起點開始往後遍歷,做標記

if  ( 

cnt++

else

if )

cnt--

else

f++cnt++

先把 ? 當 ( 算

如果 ) 太多了 break

如果 ? 可以取到值 使得這個子串成立, 答案++;

這樣就做完了

並沒有

少了關鍵的一步沒做出來… 如果僅僅是按照這樣小關係來算會出現錯誤

原因在於每次得到的都是當前位置的最終結果 並不知道先後順序 使得 ? ( 和 ( ? 的處理情況一樣 都會使得答案+1

但是先後順序是沒法得到的,怎麼避免 ? ( 的情況呢

容易想到 ? ( 中 ? 不可能是未知量 而是確定的 (

在判斷的之前先把能確定下的 ? 全部確定下來,剩下的全是可變的 ? ,再判斷能否按照題目要求變化即可.

具體實現:

#include

using

namespace

std;

#define pb push_back

#define inf 0x3f3f3f3f

#define mem(s,t) memset(s,t,sizeof s)

typedef pair pii;

typedef

long

long ll;

const

int maxn =1e5+10;

int main()

else

if(s[j]==')')

else

if(cnt<0) break;

f=min(f,cnt/2);//最多需要 cnt/2個 的 ?來參與變化 其他的?都是可確定量

if(cnt%2==0 && cnt/2

<=f) ans++;//長度為偶數 && 可以取到 cnt/2的值}}

cout

0;}

列印匹配括號

開始抽空做一些演算法題,留下記錄作為菜鳥的成長見證吧。這道題來自於cracking the coding interview,要求列印n對括號的所有可能匹配。我採用遞迴來做,這樣編寫比較方便而且容易弄懂,但用迭代應該會效率快不少而且遞迴一定能轉換成迭代吧,以後有空研究下 如下 include std...

括號匹配(二)

時間限制 1000 ms 記憶體限制 65535 kb 難度 6 描述 給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串s...

括號匹配(二)

題目 問題 給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的,所需括號個數為 0.是匹配的,所需括號個數為 0.是不匹配的,所需最少括號個數為 3.是不匹配的,所需最少括號個數為 2.分析 此題來自 作者同時給出了正確答案。但是,感覺答案還不是特別...