問題 j: 括號匹配
時間限制: 1 sec 記憶體限制: 128 mb
提交: 69 解決: 9
[提交] [狀態] [討論版]
題目描述
定義如下括號匹配序列:
1.空序列是匹配序列;
2.如果s是匹配序列,那麼(s),[s],和也是匹配序列;
3.如果a和b都是匹配序列,那麼ab也是匹配序列。
例如,下面的字串都是匹配序列:
(),,(()),(),(),()[()],}<>,(<>}),<<{}>>
而以下幾個則不是:
(,[,],)(,()),([(),<<,),<{}>)
序列中可能包含萬用字元,含義如下:
/表示任意1個左括號
#表示任意2個左括號
@表示任意4個左括號
?表示任意8個左括號
\表示任意1個右括號
*表示任意2個右括號
&表示任意4個右括號
!表示任意8個右括號
現在,給你一些由"("、")"、"["、"]"、""、"<"、">"和萬用字元構成的序列,你要做的,是判斷該序列是否為匹配序列。
輸入第一行:乙個正整數n,表示測試資料組數;
接下來n行:每行乙個括號序列(長度不超過l)。
輸出共n行:對於每乙個括號序列,判斷其是否匹配。
對於不匹配的序列,直接輸出false。
對於匹配的序列,輸出用單一空格隔開的3個資訊:
第乙個資訊為true
第二個資訊為括號的最大深度(層數)
第三個資訊為達到最大深度的次數
詳見樣例
樣例輸入
3@<>{})))>
([})
?\\\]
樣例輸出
true 5 2
false
true 8 1
提示對於第一組資料,@相當於<(((,是匹配的,括號的最大深度為5,該深度出現了2次。
對於第二組資料,[和}不匹配。
第三組資料想要說明的是,萬用字元間可以匹配。
[提交][狀態]
**:
#include
using
namespace std;
typedef
long
long ll;
void
solve()
}else
if(s[i]
==']')}
else
if(s[i]
=='}')}
else
if(s[i]
=='>')}
else
if(s[i]
=='\\')}
else
if(s[i]
=='*')}
if(!ok)
break;}
else
if(s[i]
=='&')}
if(!ok)
break;}
else
if(s[i]
=='!')}
if(!ok)
break;}
else
tmp=q.
size()
;if(tmp>res)res=tmp,time=1;
else
if(tmp==res) time++;}
if(ok&&q.
empty()
) cout<<
"true"
<<
" "<" "<不要忘了
else cout<<
"false"
<}int
main()
注意細節!!! 資料結構之棧(2 1)應用 括號匹配
編寫乙個演算法,判斷鍵盤輸入的表示式是否配對。假設括號只包含 1 所謂括號配對,就是 2 輸入的字串中,可能包含 也可能沒有 數字,及其他符號。3 每當掃瞄字串元素 現 需要進行括號匹配檢查。檢查方式為 看最近出現的 而用什麼儲存 呢?棧是選擇之一。那棧的儲存狀態是,要麼有 要麼為空。4 根據以上分...
列印匹配括號
開始抽空做一些演算法題,留下記錄作為菜鳥的成長見證吧。這道題來自於cracking the coding interview,要求列印n對括號的所有可能匹配。我採用遞迴來做,這樣編寫比較方便而且容易弄懂,但用迭代應該會效率快不少而且遞迴一定能轉換成迭代吧,以後有空研究下 如下 include std...
括號匹配(二)
時間限制 1000 ms 記憶體限制 65535 kb 難度 6 描述 給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串s...