华为2020届校园招聘面试题——括号匹配(Python实现)

题目大意为:

给定一个字符串,字符串中只包含"("、")"和"*",其中 * 可以当作左括号,也可以当作右括号,也可以什么也不当
当左右括号可以完全匹配或者在 * 的帮助下可以匹配,多余的 * 可以不用管

解题思路:

用栈对左括号进行保存,对*进行计数,当出现右括号时,先从栈中弹出左括号,若栈为空,则消耗一个*,若右括号可以完全被消耗完,则比较栈中剩余的左括号数量和*数量,若左括号数量小于等于*数量,则能够完全匹配,否则必然会有左括号剩下,匹配失败;若右括号不能被完全消耗完,则匹配失败。

def isMatching(s):
    if s is None:
        return True
    else:
        stack = []
        count = 0
        if s[0] == ")":
            return False
        for i in s:
            if stack == [] and i == '(':
                    stack.append(i)
            elif i == "*":
                count += 1
            else:
                if stack:
                    stack.pop()
                elif stack == []:
                    count -= 1
                else:
                    return False

        return len(stack) <= count


def main():
    while True:
        try:
            s = input('请输入字符串:')
            print(isMatching(s))
        except:
            break


if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值