HCSDN

仅用于学习C++

codeup25997 字符串匹配问题

codeup25997  字符串匹配问题

时空限制    1000ms/128MB

题目描述

字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]), ([])都应该输出NO

输入

文件的第一行为一个整数n,表示以下有多少个由括好组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。

输出

在输出文件中有N行,每行都是YESNO

样例输入

5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]

样例输出

YES
YES
YES
YES
NO


分析

内到外必须是<>,(),[],{},我们给它们定个优先级,<>小于()小于[]小于{}。

由题意,那么在有<>之间,(),[],{}对数为0,其它也是一样。

1、不管什么符号的左阔符,直接入栈,并计数。

2、当某个符号的右阔符时,判断比它大优先级大的阔符是否为0,并且这个符号计数>0。且栈顶为此符号的左阔符,配对成功,弹出左阔符。

3、否者匹配失败,匹配下一个字符

4、每次匹配前,判断匹配标志是否为真。真,继续匹配;假,结束此字符串匹配。

5、根据匹配标志,输出。


代码

法一:STL栈版本

#include<iostream>
#include<string>
#include<stack>
#include<algorithm>
using namespace std;
int n,cnt[5];
bool flag;
 
bool check(int x){  //在第x个符号前无,且第x个有
	for (int i=1; i<x; i++)
		if (cnt[i]) return false;
	return cnt[x]>0;
}
 
int main(){
	cin>>n;
	while (n--){
		string s;
		cin>>s;
		stack<int> sk;
		fill(cnt,cnt+5,0);
		flag = true;    //匹配
		for (int i=0,len=s.size(); i<len; i++){
			if (!flag) break;   //如果出现了不匹配
			switch (s[i]){
				case '<': sk.push(s[i]); cnt[1]++; break;
				case '(': sk.push(s[i]); cnt[2]++; break;
				case '[': sk.push(s[i]); cnt[3]++; break;
				case '{': sk.push(s[i]); cnt[4]++; break;
				case '>': if (check(1) && sk.top()=='<') { sk.pop(); cnt[1]--; }
						  else flag=false; break;
				case ')': if (check(2) && sk.top()=='(') { sk.pop(); cnt[2]--; }
						  else flag=false; break;
				case ']': if (check(3) && sk.top()=='[') { sk.pop(); cnt[3]--; }
						  else flag=false; break;
				case '}': if (check(4) && sk.top()=='{') { sk.pop(); cnt[4]--; }
						  else flag=false; break;
			}
		}
		if (flag && sk.empty()) cout<<"YES\n";
		else cout<<"NO\n";
	}
	return 0;
}

法二:手动栈版本

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int n,cnt[5],k;
bool flag;
char a[300];

void push(char ch){
	a[k++]=ch;
}

bool empty(){
	return k==0;
}

bool check(int x){	//在第x个符号前无,且第x个有
	for (int i=1; i<x; i++)
		if (cnt[i]) return false;
	return cnt[x]>0;
}

char top(){
	return a[k-1];
}

void pop(){
	if (!empty()) k--;
}

int main(){
	cin>>n;
	while (n--){
		string s;
		cin>>s;
		fill(cnt,cnt+5,0);
		flag = true;	//匹配
		k = 0;		//清空栈
		for (int i=0,len=s.size(); i<len; i++){
			if (!flag) break;	//如果出现了不匹配
			switch (s[i]){
				case '<': push(s[i]); cnt[1]++; break;
				case '(': push(s[i]); cnt[2]++; break;
				case '[': push(s[i]); cnt[3]++; break;
				case '{': push(s[i]); cnt[4]++; break;
				case '>': if (check(1) && top()=='<') { pop(); cnt[1]--; }
						  else flag=false; break;
				case ')': if (check(2) && top()=='(') { pop(); cnt[2]--; }
						  else flag=false; break;
				case ']': if (check(3) && top()=='[') { pop(); cnt[3]--; }
						  else flag=false; break;
				case '}': if (check(4) && top()=='{') { pop(); cnt[4]--; }
						  else flag=false; break;
			}
		}
		if (flag && empty()) cout<<"YES\n";
		else cout<<"NO\n";
	}
	return 0;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载,不得用于商业用途。 https://blog.csdn.net/WDAJSNHC/article/details/79968586
个人分类:
上一篇jzxx1542 括弧匹配检验
下一篇codeup26854 中缀表达式的值
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭