题解 | #合法的括号字符串#
合法的括号字符串
https://www.nowcoder.com/practice/eceb50e041ec40bd93240b8b3b62d221
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param s string字符串 # @return bool布尔型 # class Solution: def isValidString(self , s: str) -> bool: # write code here #定义2个空栈,一个用来存放左括号,一个用来存放*号,遇到右括号的时候先出stack1,当stack1为空的时候,再出stack2,当stack2为空的时候,返回False #print("ok") stack1=[] stack2=[] #print(s) for x in range(len(s)): if s[x] == "(": stack1.append(x) elif s[x]=="*": stack2.append(x) elif s[x]==")": if len(stack1)>0: stack1.pop() elif len(stack2)>0: stack2.pop() else: return False print(stack1) print(stack2) #如果比较完,stack1等于0的话,说明括号已经完全匹配了,返回true即可 if len(stack1) ==0: return True #如果说stack1大于0,并stack2大于0.stack1的元素比stack2多,需要比较stack1中的括号的位置与*的索引顺序,小于*Hao的索引才能匹配,大于星号则永远不能匹配,当stack1中的元素pop完退出while循环或者当stack1中的元素的pop值比stack2还大,需要将pop出的元素append回来直接break出循环体,最后通过比较stack1中的元素数量如果为空了,就匹配成功了说明,否则匹配失败 elif len(stack1)>0 and len(stack2)>0 and len(stack1)<=len(stack2) : #当stack1中的元素pop完退出while循环 while len(stack1)>0 : x=int(stack1.pop()) y=int(stack2.pop()) print(stack1,x,y) #比较stack1中的括号的位置与*的索引顺序,小于*Hao的索引才能匹配 if x<y: pass else: #或者当stack1中的元素的pop值比stack2还大,需要将pop出的元素append回来直接break出循环体 stack1.append(x) break print(stack1) #最后通过比较stack1中的元素数量如果为空了,就匹配成功了说明 if len(stack1) ==0: return True #说明stack1和星号没有完全匹配,匹配失败 else: return False else: return False