练习6 - 括号匹配问题 - 高端分组法(前所未见)

#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 << "输入";  

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值