括号匹配的大致内容就是:
给出一个字符串,然后输出最长的匹配子串.
匹配串的定义:
1.空串是匹配串.
2.若A是匹配串,则(A)或[A]是匹配串.
3.若A和B都是匹配串,则A+B为匹配串.
那么我们的思路很简单.
首先建立一个栈用于储存字符与字符所在位置.
然后我们扫一遍字符串,若当前字符与栈顶匹配,则将栈顶删除,并把当前字符的位置和栈顶字符的位置标记为true.
若不匹配,就将这个字符压入栈.
但是值得注意的是,你不能在栈空的时候取栈顶,不然就会Run Time Error.
所以完整代码如下:
#include<bits/stdc++.h> using namespace std; #define rep(i,j,k) for (int i=j;i<=k;i++) struct ch{ char c; int x; }; stack< ch > st; bool b[1000001]={0}; string s; inline void into(){ cin>>s; } inline void work(){ rep(i,0,s.size()-1){ if (!st.empty()&&(s[i]==')'&&st.top().c=='('||s[i]==']'&&st.top().c=='[')) b[i]=b[st.top().x]=1,st.pop(); else st.push({s[i],i}); } } inline void outo(){ int maxx=0,x,sum=0; rep(i,0,s.size()-1) if (b[i]) sum++; else { if (maxx<sum) maxx=sum,x=i-sum; sum=0; } if (sum>maxx) maxx=sum,x=s.size()-sum; rep(i,x,x+maxx-1) printf("%c",s[i]); printf("\n"); } int main(){ into(); work(); outo(); return 0; }
细节:&&的优先级比||高,所以在要先执行||的时候得加括号.