括号匹配加强版的解析

括号匹配的大致内容就是:

给出一个字符串,然后输出最长的匹配子串.

匹配串的定义:

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;
}

细节:&&的优先级比||高,所以在要先执行||的时候得加括号.

猜你喜欢

转载自blog.csdn.net/hzk_cpp/article/details/79992103