jzyzoj 棧 P1148 括號匹配加強版

2022-08-16 13:36:15 字數 1685 閱讀 4480

括號匹配加強版

描述 description

對於乙個由(,),[,]括號組成的字串,求出其中最長的括號匹配字串。 具體來說,滿足如下條件的字串成為括號匹配的字串: (1) (), 是括號匹配的字串。 (2) 若a是括號匹配的串,則(a)或[a] 是括號匹配的字串。 (3) 若a和b都是括號匹配的字串,則a+b也是括號匹配的字串。(這裡的+是字串的加法運算)。 例如:(),,(),()() 都是括號匹配的字串,而][,[( ]),(]則不是。 字串a的子串是指由a中連續若干個字元組成的字串。例如:a,b,c,abc,cab,abccabc都是abcabc的子串。空串是任何字串的子串。

輸入格式 input format

輸入一行,為乙個僅由()組成的非空字串。(括號都是英文輸入法的括號)

輸出格式 output format

輸出也僅有一行,為最長的括號匹配子串。若有相同長度的子串,輸出位置靠前的子串。

樣例輸入 sample input

【輸入樣例1】 ([(][()]]()

【輸入樣例2】 ())

樣例輸出 sample output

【輸出樣例2】 [()]

【輸出樣例2】 ()

時間限制 time limitation 1s

注釋 hint 【資料規模】 對於20%的資料,字串長度<=100 對於50%的資料,字串長度<=10,000 對於100%的資料,字串長度<=1,000,000

思路:這道題棧的經典應用,需要注意的就是如果不匹配棧需要清空。對於題上給的    a匹配,b匹配,則a+b匹配   我們可以把每個匹配的bool標記,這樣最後列舉的時候 for i=1.....n bool[i]=1 肯定是連續的。

**:

#include#include

#include

#include

using

namespace

std;

int stack[1000100

];int top=0;//

char ans[1000100];

char c[1000100

];bool f[1000100

];int n=0;//

int len=0;

//int id=0;

//int t=0;

inline void push(int

x)void check(int

i) }

else

if(c[stack[top]]=='['

)

}else

if((c[stack[top]]=='

)')||(c[stack[top]]==']'

))

}else

else

return

; }

//cout

void

work()

i=t-1

;

if(len>ans)

len=0

; }

}//cout<

cout<

}int

main()

//cout/

cout<

//cout

return0;

}

view code

括號匹配 棧

蒜頭君在紙上寫了乙個串,只包含 和 乙個 能唯一匹配乙個 但是乙個匹配的 必須出現在 之前。請判斷蒜頭君寫的字串能否括號完全匹配,如果能,輸出配對的括號的位置 匹配的括號不可以交叉,只能巢狀 一行輸入乙個字串只含有 和 輸入的字串長度不大於 50000 如果輸入括號不能匹配,輸出一行 no 否則輸出...

棧括號匹配

input 輸入包括多組測試資料,每組資料是乙個字串,字串只包含 等字元。output 對於每組資料輸出 yes 表示當前字串中的括號是匹配的,否則輸出 no 不包括引號 sampleinput sampleoutput yes no題解 利用棧 includeusing namespace std...

棧 括號匹配

括號匹配,棧的經典題目,將左括號入站,然後遇到右括號就詢問棧頂是不是與之相匹配的左括號,如果是,出棧,不是,匹配失敗。注意這個題目是多組輸入,而且包含空格,所以需要用 gets讀入。include include include include using namespace std typedef...