ACM-括号匹配问题

  对ACM仰慕已久,无奈今天才开始。好吧,遇到的第二个题目就把我难到了。(实话是第一个)

  进入正题,下面Copy出题目:

  

 现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes

拿到该题目的时候,想的最多的当然是括号匹配的问题,并没有思考其他的。以下是我思考的过程:随便写一个很长的括号匹配的例子来找到其中的规律。如下:[([()])()]

欣喜若狂,找到了如下的规律:1.如果这个字符串的长度为奇数,不用看了,这个字符串已经不可能匹配了。所以会用到strlen()函数。2.对于满足偶数条件的,那就从第一个字符开始查找。先找第一个,再找第二个:  若第一个和第二个不匹配,表明从最后一个括号肯定是匹配的,所以开始匹配判断。(以此类推)。

当深入分析的时候,发现,好吧,该模型太理想化了,不行。存在严重的错误,只有当该括号完全中心轴对称才会满足这种情况,PASS。

所以,我又想了一下其他的,终于,考虑到递归+消除的思想,想到了一个绝佳的点子:1.递归-->解析到最小解;2.消除-->匹配以后我就不用管了。在括号匹配中,总会有这种情况出现:()或[]。当把这一部分消除以后,剩下的部分也总是会出现()或[]。那么,是否可以将此作为一个单位消除掉,直到最后整个序列全部消除?我想应该是可以的。但是,如何去实现这一部分?采用什么方式去实现,又是一个头疼的问题。这让我联想到了播放音乐时候的“节奏条”(姑且这么称呼吧),可以大,可以小,最后可以没有。所以,我需要两个部分。1.字符串首地址指针。2.移动指针。总觉得少了一点什么,怎么去表示删除的字符呢?在原字符串中可以表示吗?又是一个难题。需要去解决,于是想到了其他的解决方案:将字符串序列中的第一位开始,一个一个判断,利用"FILO"的方式进行表示,所以就有了如下的思路:1.将元素一个一个压栈,若将要入栈的元素和栈顶元素匹配,那么弹出栈顶元素。2.遍历整个字符串,当遍历完了以后,判断当前栈底,栈顶都在哪里。如果相等,说明匹配,否则。为什么不能再中途引进错误判断机制呢?将这些匹配元素,我们可以分为两类:一类为左,一类为右。(这不是废话吗?)但检测到将入栈的元素和栈顶元素不为同一类,并且不匹配。那么,我们就有权去说:不用查了,这个字符串打死我,我也会说No.

如果说,栈操作深奥了,可以利用外部数组(就是一个数组)的方式来作为删除元素的缓存Buff。

那么,就有了如下:1.判断当前字符串的长度。2.将字符串从第一个字符拷贝到Buff中。3.错误判断机制,若在不同类,并且匹配,那么将当前所在的索引处的值初始化,并将数组元素的动态索引值-1.4.其间,没有错误,并且处理完当前字符串,否则No.5.ok,没有问题,返回YES。

以上,只是解决了字符串的匹配问题,还有输出呈现。好吧!!!输出呈现是个数组,可以实时处理么? 思路:将每一行比较的结果存在一个结果缓存区,最后通过循环的方式,遍历输出。20150910,差Code。



  
时间: 2024-10-29 02:42:47

ACM-括号匹配问题的相关文章

NYOJ 括号匹配系列2,5

本文出自:http://blog.csdn.net/svitter 括号匹配一:http://acm.nyist.net/JudgeOnline/problem.php?pid=2 括号匹配二:http://acm.nyist.net/JudgeOnline/problem.php?pid=15 之前被这个题目难住,现在看动态规划就顺便过来AC了它.结果发现当年被难住一点也不丢人.. 括号匹配一很简单,就是栈的应用,AC代码: //================================

区间dp 括号匹配 nyoj 15

题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=15 括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来. 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的 输入 第一行输入

括号匹配问题 区间DP经典问题

题目链接 http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=15 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 分析:要求要添加多少个,可以求出最大匹配的长度,这样剩下的都是没有匹配的,所以每个对于一个匹配就可以了. 即 答案 =

HDU 3351 Seinfeld(括号匹配)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3351 解题报告:输入一个只有'{'跟'}'的字符串,有两种操作,一种是把'{'变成'}',另一种是'}'变成'{',问你要把这个字符串的括号变成合法的最少需要多少次操作. 在刷DP专题,居然有个这个题目,看起来也像是DP,一直在想用DP怎么做,始终没做出来,最后试下直接字符串匹配居然A了.跟普通的字符串匹配的区别就是 在插入'}'这个的时候判断一下栈是不是为空,如果栈为空,则把这个'}'改为'{'再

nyoj 括号匹配

这个方程有两种形式,本文采用 if(s[i]=s[j]) dp[i][j]=d[i-1][j-1] dp[i][j]=min(dp[i][k]+dp[k+1][j],dp[i][j]) (i=<k<j) 其实与另一种方法比较:根据j的所有匹配情况取最小值 1.i到j无匹配,取为dp[i][j-1]+1 2.列举所有匹配情况 dp[i][k-1]+dp[k+1][j] 取上述所有情况最小值 两者都能获得正确的结果. 同时两者的初始化为 dp[i][j]==1 if(i==j) 规划方向为:  

括号匹配问题(顺序栈实现)

本周老师作业留了两个.先上传一个吧.那个有时间我再传上来~ 本周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素和判空操作 括号匹配问题 3.编写主函数实现基本操作函数功能,并设置测试数据,测试合法和非法数据的输出结果. 4.程序调试运行并保存输出结果. 5.整理并提交实验作业. 1 #include <cstdio> 2 #include <cstring>

堆栈_括号匹配

class Solution { public: bool isValid(string s) { if(s.empty()) return false; stack<int> s1; int n=s.size(); for(int i=0;i<n;i++) { if(s[i]=='('||s[i]=='['||s[i]=='{') s1.push(s[i]); else if(s1.empty()) return false; else if((s[i]==')'&&s

括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不

动态规划(2)--括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超

行编辑程序、括号匹配检验

行编辑程序.括号匹配检验程序都是利用的栈的数据结构.而这两个 小程序也非常好的显示了栈先进后出的思想.由于程序本身很简短.清晰,所 以也就不做多的解释了,直接上代码了. 行编辑程序: #include<iostream> #include<stack> using namespace std; int main() { stack<char> sta; char ch = getchar(); while(ch!=EOF) { while(ch!=EOF&&am