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

题面请查看: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";
}

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

posted @ 2019-08-05 17:14  littlefrog  阅读(153)  评论(0编辑  收藏  举报