NOI题库2.2括号匹配分析与题解(C++)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对吗?
如果“(”下标从left[0]开始存储,当第 一个“(”匹配完后,j = -1,就会出现下标 越界!!! 只要修改一句: left[j++] = i; left[++j] = i;
完成。
Baidu Nhomakorabea
本算法时间复杂度O(n)
本题相当于普及组1~2题难度
Thanks for watching.
By yjp
((ABCD(x) )(rttyy())sss)(
((ABCD(x) $$ )(rttyy())sss)( ? ?$
问题分析
本题大致意思就是,对给定的多个字符 串,输出其中无法匹配的括号标记(左括号 “$”,右括号“?”),其他字符输出空格,且 位置严格按照原串。 所以最重要的就是找出无法匹配的括号 并标记。
问题分析
那么,如何找呢? 首先要清楚什么是匹配。题目说,任何 一个左括号都从内到外与在它右边且距离最 近的右括号匹配。 下图中,相同颜色的括号匹配。
((aa())a)bb)) ??
问题分析
很容易想到,可以假设一开始查找到的 “(”无法匹配,设为“$”,并记录下它的下标 。其他字符直接设为空格。 如此,直到查找到“)”,访问它和离它最 近的“(”的下标,在原串中设为空格。 当然,如果找到的“(”下标是一个不可能 的值,例如-1,则该“)”无法匹配,在原串中 设为“?”。 ((aa())a)bb))
else if(S[i] == ')') //找到")" { if(left[j] >= 0) //有匹配的左括号,下标不为-1 { S[left[j]] = S[i] = ' '; //设空 j--; //找上一个左括号 } else S[i] = '?'; //未匹配 } else S[i] = ' '; //其他字符设空 } cout << S << endl; //输出(已修改后的S) }
问题描述
在某个字符串(长度不超过100)中有 左括号、右括号和大小写字母;规定(与常 见的算数式子一样)任何一个左括号都从内 到外与在它右边且距离最近的右括号匹配。 写一个程序,找到无法匹配的左括号和右括 号,输出原来字符串,并在下一行标出不能 匹配的括号。不能匹配的左括号用“$”标注, 不能匹配的右括号用“?”标注。
$$ $ ??
这样就写出了代码:
string s; while(getline(cin, S)) //读入整行 { cout << S << endl; //输出原串 int left[102],j=0; //left[]记录所有"("在S中的下标,j只是指针 memset(left, -1, sizeof(left)); //初始化-1 for(int i = 0; i < S.size(); i++) //查找 { if(S[i] == '(') //找到"(" { left[j++] = i; //记录下标 S[i] = '$'; //假设该括号未匹配 }
输入
输入包括多组数据,每组数据一行,包 含一个字符串,只包含左右括号和大小写字 母,字符串长度不超过100
输出
对每组输出数据,输出两行,第一行包 含原始输入字符,第二行由"$","?"和空格组 成,"$"和"?"表示与之对应的左括号和右括 号不能匹配。
Sample input
Sample output