#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;
string s;
//int j=0; //累计变量 - 报数
//int h=0; //累计变量 - 统计左括号数
int h[101][2]={0};
int j = 0; //区间号
int g[101];
bool flagR = false; //记录有无右括号出现
bool flagL = false;
void kuohao(int i);
/*分组思想的运用
例:)(rttyy())sss)(
左->右时
当①有左括号 && 前面有右括号 -> 分组号+1 -> 每组互不干扰
分为3组
①)
②(rttyy())sss)
③(
右->左时
当①有右括号 && 后面(右边)有左括号时 -> 分组号-1 -> 前面分组的逆运算
PS:①右括号的?在过去时设置
②左括号的$在回来时设置
③要储存每组的左括号个数 -> 清楚残缺的个数
*/
int main()
{
cout << "输入:";
cin >> s;
g[s.length()] = {0};
kuohao(0);
for(int i=0;i<s.length();i++){
switch(g[i]){
case 0:cout<<" ";break;
case 1:cout<<"$";break;
default:cout<<"?";
}
}
return 0;
}
void kuohao(int i){ //i为s的下标
if(i==s.length()) return; //遍历结束,BYEBYE!
if(s[i] == '('){
if(flagR){j++;flagR=false;} //前面有右括号 -> 右移区间
h[j][0]++; //报数 ->类似约瑟夫圈
h[j][1]++; //此区间内的左括号数
kuohao(i+1);
//回来时看前面有无左括号
flagL = true;
if(h[j][1]>h[j][0]){ //多余的括号
h[j][1]--;
}else{
g[i] = 1;
}
}else if(s[i] == ')'){
flagR = true; //出现右括号
if(h[j][0] ==0){
g[i] = 2; //"残缺右括号"
kuohao(i+1);
}else{
h[j][0]--;
kuohao(i+1);
}
if(flagL){j--;flagL = false;}
}else{
kuohao(i+1); //取补集思想 -> 数字?啥事也没有,接着下一格!
}
}
//((ABCD(X)
//)(rttyy())sss)(
//cout << "输入";
练习6 - 括号匹配问题 - 高端分组法(前所未见)
最新推荐文章于 2023-09-06 21:39:37 发布