字符串、循环、判断

题目:有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
1. 左括号必须用相同类型的右括号闭合。
2. 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false

示例 5:
输入: "{[]}"
输出: true

def isValid(s): # 这个方法没有判断优先级
    """
    :type s: str
    :rtype: bool
    """
    dic={'(':')','[':']','{':'}'}
    stack=[] # 使用栈这种数据结构
    for current in s:
        if current in dic.keys(): # 如果是左括号,那么就加入到列表中
            stack.append(current)
        elif current in dic.values():
            if len(stack)==0 or dic.get(stack[-1])!=current:# 如果第一个是反括号,或者不是成对的括号,那么就返回False
                return False
            else:
                stack.pop() # 如果能找到,就把对应的左括号删除
    if len(stack)==0:
        return True
    else:
        return False

print("{[]()}()[(())]",isValid("{[]()}()[(())]"))
print("()[]{}",isValid("()[]{}"))
print("(]",isValid("(]"))
print("([)]",isValid("([)]"))
print("{[]}",isValid("{[]}"))
def func(s): # 这个方法是判断了优先级的,小括号里面不能有大括号和中括号,中括号里面不能有大括号
    s_d = []
    s_z = []
    s_x = []

    for i in range(len(s)):
        if s[i] == "{" or s[i] == "}":
            s_d.append(i)
        elif s[i] == "[" or s[i] == ']':
            s_z.append(i)
        else:
            s_x.append(i)
    if len(s_d) % 2 != 0 and len(s_z) % 2 != 0 and len(s_x) % 2 != 0:
        return False
    else:
        if s_x and (len(s_x) // 2 + sum(s_x)) % 2 != 0:
            return False
        if s_z and (len(s_z) // 2 + sum(s_z)) % 2 != 0:
            return False
        if s_d and (len(s_d) // 2 + sum(s_d)) % 2 != 0:
            return False
        else:
            if s_x:
                list1 = []
                list2 = []
                for i in s_x:
                    if s[i] == "(":
                        list1.append(i)
                    else:
                        list2.append(i)
                for i in list1[::-1]:
                    for j in list2:
                        if i < j and ((i + j) + 1) % 2 == 0:
                            if "{" in s[i:j] or "}" in s[i:j] or "[" in s[i:j] or "]" in s[i:j]:
                                return False
                        else:
                            break
            if s_z:
                list3 = []
                list4 = []
                for i in s_x:
                    if s[i] == "[":
                        list3.append(i)
                    else:
                        list4.append(i)
                for i in list3[::-1]:
                    for j in list4:
                        if i < j and ((i + j) + 1) % 2 == 0:
                            if "{" in s[i:j] or "}" in s[i:j]:
                                return False
                            else:
                                break
            return True


print(func("{[]}"))
print(func("([)]"))
print(func("()[]{}"))
print(func("{[]()}()[(())]"))

猜你喜欢

转载自www.cnblogs.com/su-sir/p/12020628.html