标签:
对ACM仰慕已久,无奈今天才开始。好吧,遇到的第二个题目就把我难到了。(实话是第一个)
进入正题,下面Copy出题目:
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。
标签:
原文地址:http://www.cnblogs.com/ply616/p/4796594.html