【记录】洛谷P1739-表达式括号匹配AC记

博客主要记录了洛谷P1739题目中关于表达式括号匹配的解题思路。首先介绍了原始的70分解决方案,即遇到括号就寻找其配对括号,若找不到则输出错误。然后指出该方法的不足,即存在重复搜索的问题。接着提出了改进方案,通过数组记录每个括号的访问状态,跳过已被匹配的括号,确保匹配未使用过的括号。最后提及代码中的一些细节修正。

题面请查看:https://www.luogu.org/problem/P1739

思路:

见到括号就搜索,搜到与它配对的括号为止,搜不到就输出NO

代码:


#include <bits/stdc++.h>
using namespace std;
int main() {
	string aa;
	getline(cin,aa,'@');
	if(aa.size()==0) {
		cout<<"NO"<<endl;
		return 0;
	}
	int r = 0,l = 0;
	for(int i=0;i<aa.size();++i) {
		if(aa[i]=='(') {
			bool flag = false;
			for(int j = i;j<aa.size();++j) {
				if(aa[j]==')') {
					flag++;
				}
			}
			if(!flag) {
				cout<<"NO";
				return 0;
			}
		}
		if(aa[i]==')') {
			bool flag = false;
			for(int j = i;j>0;--j) {
				if(aa[j]=='(') {
					flag++;
				}
			}
			if(!flag) {
				cout<<"NO";
				return 0;
			}
		}
	}
	
	cout<<"YES";
}

70分。

改正思路:

  1. vis数组记录每一个括号的访问情况,避免重复。
  2. 如果当前括号被匹配过了就没有必要看了,直接continue;
  3. 每次要找一个没用过的括号匹配。

改后代码:

#include <bits/stdc++.h>
using namespace std;
bool vis[2001] = {0};
int main() {
	string aa;
	getline(cin,aa);
	if(aa.size()==0) {
		cout<<"NO"<<endl;
		return 0;
	}
	int r = 0,l = 0;
	for(int i=0;i<aa.size();++i) {
        if(vis[i]) {
            continue;
        }
		if(aa[i]=='(') {
			bool flag = false;
			for(int j = i;j<aa.size();++j) {
				if(aa[j]==')'&&vis[j]==0) {
					flag++;
                    vis[j]++;
                    vis[i]++;
                    break;
				}
			}
			if(!flag) {
				cout<<"NO";
				return 0;
			}
		}
		if(aa[i]==')') {
			bool flag = false;
			for(int j = i;j>=0;--j) {
				if(aa[j]=='('&&vis[j]==0) {
					vis[j]++;
                    vis[i]++;
                    flag++;
                    break;
				}
			}
			if(!flag) {
				cout<<"NO";
				return 0;
			}
		}
	}
	
	cout<<"YES";
}

其实细节上也改了一些的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值