c++程序or 文本 是否括号匹配, 不匹配输出第一个不匹配的符号?

  1. 对于c++程序类文本 核心:对于每一个右括号发,肯定和离他最近的左边括号匹配,如果离他最近的左括号不是与之对应左括号,或者直接没有左括号。那就的就肯定不匹配。 开一个储存左括号的栈
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin.tie(nullptr);
	getline(cin, s);
	m['$'] = '@';
	m[')'] = '(';
	m[']'] = '[';
	m['}'] = '{';
	while ( s[0] != '.' ) {
		for ( int i = 0; i < s.length(); i++ ) {
			char c = s[i];
			if ( i + 1 < s.length() && c == '/' && s[i + 1] == '*' ) {
				i++;
				c = '@';
			}
			else if ( i + 1 < s.length() && c == '*' && s[i + 1] == '/' ) {
				i++;
				c = '$';
			}
			if ( m.count(c) ) {
				if ( das.empty() ) {
					printf("NO\n");
					if ( c == '$' )
						cout << "?-*/" << endl;
					else
						cout << "?-" << c << endl;
					return 0;
				}
				else if ( das.top() != m[c] ) {
					printf("NO\n");
					if ( das.top() == '@' )
						cout << "/*-?" << endl;
					else
						cout << das.top() << "-?" << endl;
					return 0;
				}
				das.pop();
			}
			else {
				if ( c == '(' || c == '{' || c == '[' || c == '@' ) {
					das.push(c);
				}
			}
		}
		getline(cin, s);
	}
	if ( das.empty() ) {
		printf("YES");
	}
	else {
		printf("NO\n");
		if ( das.top() == '@' )
			cout << "/*-?" << endl;
		else
			cout << das.top() << "-?" << endl;
	}
	return 0;
}

对于普通类文本:符号匹配思想差不多,但是要记录第一个不匹配的字符位置,有几个特殊样例

012345
((({)}  第一次不匹配的位置应该是4 (,并且对于普通文本{}这个括号她是匹配的,
        但是在c++程序文本那肯定是不匹配的。

012345
((({}  第一次不匹配的位置应该是0  (


012345678
(((())))) 第一次不匹配的位置7

code

string s;
int cnt[6];
size_t pos = 1000;//right more,pos
char ans = ' ';
bool once = 1;
size_t apos = 2000;
int rev[6];
map<char, stack<char>> dty;
map<char, char> sav;
void del()
{
	int len = s.size() - 1;
	ifor(i, 0, len)
	{
		if ( s[i] == '/' && s[i + 1] == '*' )
		{
			s[i] = '@';
			s[i + 1] = ' ';
		}
		if ( s[i] == '*' && s[i + 1] == '/' )
		{
			s[i] = '$';
			s[i + 1] = ' ';
		}
	}
	// 	cout << s << endl;
}


const string ss1 = "@({[";
const string ss2 = "$]})";
void pro(char c, int p) {
	if ( ss1.find(c) != string::npos )
	{
		dty[c].push(c);
	}
	else if ( ss2.find(c) != string::npos )
	{
		if ( dty[sav[c]].empty() )
		{
			if ( once )
			{
				ans = c;
				pos = p;
			}
		}
		else {
			dty[sav[c]].pop();
		}
	}
}
vector<char> res;
void solved()
{
	ifor(i, 0, s.size() - 1)
	{
		pro(s[i], i);
	}
	for ( auto it = dty.begin(); it != dty.end(); ++it )
	{
		if ( !(it->second).empty() )
		{
			res.push_back(sav[it->first]);
		}
	}
	auto p = begin(res);
// 	cus::print(res);
// 	cout << endl;
	if ( res.empty() );
	else {
		size_t temp;
		while ( p != res.end() )
		{
			if ( s.rfind(*p) != string::npos )
				temp = s.rfind(*p);
			else temp = s.find(sav[*p]);
			apos = min(apos, temp);
			++p;
		}
	}

	int flag = 1;
	if ( apos > pos ) {
		flag = 0; apos = pos;
	}
	if ( pos >= s.size() && apos >= s.size() ) {
		cout << "YES"; return;
	}
	else {
		cout << "NO" << endl;
		
		if ( flag )//left more;
		{
			if ( s[apos] == '@' || s[apos] == '$' )
				cout << "/*-?" << endl;
			if ( s[apos] == '(' || s[apos] == ')' )
				cout << "(-?" << endl;
			if ( s[apos] == '[' || s[apos] == ']' )
				cout << "[-?" << endl;
			if ( s[apos] == '{' || s[apos] == '}' )
				cout << "{-?" << endl;
		}
		else {
			if ( s[apos] == '$' )
				cout << "?-*/" << endl;
			else cout << "?-" << s[apos] << endl;
		}
	}
}
int main() {
	/*ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin.tie(nullptr);*/
	sav['$'] = '@';
	sav[')'] = '(';
	sav['}'] = '{';
	sav[']'] = '[';
	sav['@'] = '$';
	sav['('] = ')';
	sav['['] = ']';
	sav['{'] = '}';
	char s1[10000];
	scanf("%[^EOF]", s1);
	s = move(s1);
	del();
	solved();
	return 0;
}
全部评论

相关推荐

首先讲三个故事,关于牛客的事件一:2024年,牛客上有一对高学历情侣,求职方向与我当时一致,都是嵌入式方向。他们恰好是我的朋友,专业能力和学历背景都很扎实,也因此拿到了不少优质offer。和很多求职者一样,他们把offer情况整理后发在平台上,本意是记录与交流,但很快引发了争议。有声音指责他们“集邮”“不释放名额”,认为这种展示本身就是一种炫耀。最终讨论失控,当事人删除内容,事件也很快被遗忘。事件二:小红书评论区,一条评价获得了不少共鸣:“感觉牛客就是当年那群做题区毕业了开始找工作还收不住那股味,颇有一种从年级第一掉到年纪第二后抱怨考不上大学的味道”,这条评论被水印里这个同学转发到牛客后,评论...
小型域名服务器:当看到别人比自己强的时候,即便这是对方应得的,很多人会也下意识的歪曲解构对方的意图,来消解自己在这本就不存在的比较中输掉的自信,从而平白制造出很多无谓的争论。比如你会在空余时间来写优质好文,而我回家只会暗区突围,那么我就可以作为键盘侠在这里评论你是不是XXXXXXXX。即便我自己都知道这是假的,但只要这没那么容易证伪,那么当你开始回应的时候,脏水就已经泼出去了,后面可能会有更多的人带着情绪来给我点赞,而毫不关注你写的文章内容本身是啥了。
SAGIMA牛马咖啡
点赞 评论 收藏
分享
想run的马里奥在学...:这个学历帮你扫平百分之80的障碍,投就完了,这会找不到就等3月暑期一样能找到
点赞 评论 收藏
分享
老粉都知道小猪猪我很久没更新了,因为秋招非常非常不顺利,emo了三个月了,接下来说一下我的情况吧本人是双非本&nbsp;专业是完全不着计算机边的非科班,比较有优势的是有两段大厂实习,美团和字节。秋招面了50+场泡池子泡死的:滴滴&nbsp;快手&nbsp;去哪儿&nbsp;小鹏汽车&nbsp;不知名的一两个小厂其中字节13场&nbsp;两次3面挂&nbsp;两次2面挂&nbsp;一次一面挂其中有2场面试题没写出来,其他的都是全a,但该挂还是挂,第三次三面才面进去字节,秋招加暑期总共面了22次字节,在字节的面评可以出成书了快手面了8场,2次实习的,通过了但没去,一次2面挂&nbsp;最后一次到录用评估&nbsp;至今无消息滴滴三面完&nbsp;没几天挂了&nbsp;所有技术面找不出2个问题是我回答不上来的,三面还来说我去过字节,应该不会考虑滴滴吧,直接给我干傻了去哪儿一天速通&nbsp;至今无消息小鹏汽车hr&nbsp;至今无消息美团2面挂&nbsp;然后不捞我了,三个志愿全部结束,估计被卡学历了虾皮二面挂&nbsp;这个是我菜,面试官太牛逼了拼多多二面挂&nbsp;3道题也全写了&nbsp;也没问题是回答不出来的&nbsp;泡一周后挂腾讯面了5次&nbsp;一次2面挂&nbsp;三次一面挂,我宣布腾讯是世界上最难进的互联网公司然后还有一些零零散散的中小厂,但是数量比较少,约面大多数都是大厂。整体的战况非常惨烈,面试机会少,就算面过了也需要和各路神仙横向对比,很多次我都是那个被比下去的人,不过这也正常,毕竟谁会放着一个985的硕士不招,反而去招一个双非读化学的小子感觉现在互联网对学历的要求越来越高了,不仅仅要985还要硕士了,双非几乎没啥生存空间了,我感觉未来几年双非想要进大厂开发的难度应该直线上升了,唯一的打法还是从大二刷实习,然后苟个转正,不然要是去秋招大概率是炮灰。而且就我面字节这么多次,已经开始问很多ai的东西了,你一破本科生要是没实习没科研懂什么ai啊,纯纯白给了
不知名牛友_:爸爸
秋招你被哪家公司挂了?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务