> 文章列表 > 力扣题库刷题笔记20-有效的括号

力扣题库刷题笔记20-有效的括号

力扣题库刷题笔记20-有效的括号

1、题目如下:

2、个人Python代码实现如下:

        第一次读题就理解错了题意,以为是只判断小括号闭合,大括号、中括号只是干扰元素。再次读题后,代码实现如下:

        以上代码仍旧是没有理解清楚题意,以为是只要左括号(在右括号)右边即可,大中括号以此类推。所以通过切片来进行判断,但是代码的逻辑仍然有漏洞,没有考虑到左括号在字符串最后一位,导致下标越界。

         中间尝试过分别使用count(判断元素存在个数)、index(查询元素下标)、find(判断元素是否存在,存在则返回下标,不存在则返回-1),但是或多或少都理解错了题意:

        跳过中间其他错误的尝试,以上代码也是最后一次对于题意的错误的理解,以为是每一种括号中间不能有其他括号元素。

        经过仔细思考,突然想起华为机考的一道递增字符串的题,取巧后答案很简单,同样也可以用于这道题,思路如下:

        如果需要返回True,则字符串里面一定存在'()'、'[]'、'{}'这3个元素其中一个,然后将其替换为空,继续判断是否存在这3个元素,循环结束后,如果字符串为空,则返回True。反之,如果字符串中存在不完整的括号(某一种括号只有左括号或者右括号),在循环过程结束后,字符串长度一定不为0。同理,如果某一种括号中间存在其他不完整的括号,那么循环结束后,字符串也一定不为空。是所以代码实现如下:

        以上是思路没有问题,但是代码错误,原因是进入了死循环。这里按照预期,进入第一次循环后,标志位flag就会变成0,从而跳出循环,但是并没有。Pycharm自带的观察元素flag值一直为1,但是手动添加的观察元素值确为0,这一点我并不明白。

        这里询问了某田大佬,做了循环次数的代码限制,终于是成功了

        最后还是没有太明白为啥会有问题,浅看了一手递增字符串while循环的条件做了修改,最终代码如下:

3、力扣热门题解

        这里是需要大佬指点迷津的地方,还请大佬们不吝指教。

        本题本身考察的是栈,在看过题解后初步理解了部分栈的思路:

        个人感觉代码和栈有了初步认知,而且本地直接运行也能跑通,不理解的是调试的部分:

 

         这里不理解为什么第一次循环stack为空,以下代码和力扣提交记录也能证明栈的思路没有问题: