Python每日一练——第6天:判断有效括号

218 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19 天,点击查看活动详情

1. 算法描述

给定一个只包括'(',')', '{', '"','[',']的字符串,判断字符串是否有效。有效字符串需满足:

  • 1.左括号必须用相同类型的右括号闭合。
  • 2.左括号必须以正确的顺序闭合。
  • 空字符串可被认为是有效字符串。

2. 实例说明

只有左右括号向对应才是有效

在这里插入图片描述

3. 算法思路

  • 解法一:字符串替换法,在字符串中找成对的()、[]、{},找到后替换成空,然后判断是否为空,如果为空就是有效,如果不为空则相反
  • 解法二:利用栈的后进先出原则 stack = list()
{([])}

3. 代码实现

字符串替换法

字符串替换可以使用正则 re.sub 或者 str.replace()

实现代码📝:

import re


def valid_str(string):
    # 不是2的倍数直接返回false
    if len(string) % 2 == 1:
        return False
    while '()' in string or '[]' in string or '{}' in string:
        string = re.sub('\(\)|\[\]|{}', '', string)
    return string == ''
print(valid_str('()'))
print(valid_str('()[]{}'))
print(valid_str('(}'))

运行结果👇:

在这里插入图片描述

实现代码📝:

import re


def valid_str(string):
    # 不是2的倍数直接返回false
    if len(string) % 2 == 1:
        return False
    stack = []
    # 字典保存左右括号的关系
    char_dict = {
        ')':'(',
        '}':'{',
        ']':'['
    }
    for char in string:
        # 如果遍历的字符在字典里说明是右括号
        if char in char_dict :
            # 右括号对的左括号是否栈里的左括号
            if not stack or char_dict[char] != stack.pop():
                return False
        # 反之是左括号就加入栈
        else:
            stack.append(char)
    return not stack

print(valid_str('()'))
print(valid_str('()[]{}'))
print(valid_str('(}'))

运行结果: 在这里插入图片描述