如何在Python中检查字符是否在字符串中的另一个字符之前

时间:2017-11-17 03:19:24

标签: python python-3.x

我正在编写一个程序,用于确定用户输入的数学方程式是否具有匹配的括号。我知道右括号的数量是否等于左括号的数量,但用户可以输入2)(3 + x)(4 + x)(6。在这种情况下,我要避免告诉用户他的括号匹配,我想检查一个')'是否出现在'('。

之前
'3.enterain.py'

3 个答案:

答案 0 :(得分:0)

这里的一般想法是使用堆栈。 当你遇到一个开括号时,把它推到堆栈上 当您遇到右括号时,POP会从堆栈中开始括号的开头括号

答案 1 :(得分:0)

使用堆栈绝对没有必要。只需计算打开多少个括号。如果该计数为负数,则它们不匹配,如果计数结果为正数,则它们不匹配:

def valid_parens(string):
    open_count = 0
    for char in string:
        if char == "(":
            open_count += 1
        elif char == ")":
            open_count -= 1
            if open_count < 0:
                return False
    return open_count == 0

测试用例:

assert valid_parens("((2+2)-4)*2") == True
assert valid_parens(")(2/2)(") == False
assert valid_parens("()()()") == True
assert valid_parens("((())") == False

答案 2 :(得分:0)

尽管问题可以通过堆栈解决,但它有点浪费内存。在正常大小的输入中,这不会是一个问题,但在非常大的序列中,它将成为一个问题。你不需要跟踪parens本身,但只需计算有多少个开放的内存 - 总内存使用量是一个整数,而不是每个paren遇到的堆栈中的一个条目。

def proper_paren(seq):
    open_parens = 0
    for char in seq:
        if char == '(':
            open_parens += 1
        elif char == ')':
            open_parens -= 1
            if open_parens < 0:
                return False
    return open_parens == 0