括號匹配加強版
描述 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#includeview code#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;
}
括號匹配 棧
蒜頭君在紙上寫了乙個串,只包含 和 乙個 能唯一匹配乙個 但是乙個匹配的 必須出現在 之前。請判斷蒜頭君寫的字串能否括號完全匹配,如果能,輸出配對的括號的位置 匹配的括號不可以交叉,只能巢狀 一行輸入乙個字串只含有 和 輸入的字串長度不大於 50000 如果輸入括號不能匹配,輸出一行 no 否則輸出...
棧括號匹配
input 輸入包括多組測試資料,每組資料是乙個字串,字串只包含 等字元。output 對於每組資料輸出 yes 表示當前字串中的括號是匹配的,否則輸出 no 不包括引號 sampleinput sampleoutput yes no題解 利用棧 includeusing namespace std...
棧 括號匹配
括號匹配,棧的經典題目,將左括號入站,然後遇到右括號就詢問棧頂是不是與之相匹配的左括號,如果是,出棧,不是,匹配失敗。注意這個題目是多組輸入,而且包含空格,所以需要用 gets讀入。include include include include using namespace std typedef...