题目描述
力扣思路
上面是大致思路
下面是具体细节代码
力扣代码
class Solution:
def longestValidParentheses(self, s: str) -> int:
if not s:return 0
stack = []
ans = 0
for i in range(len(s)):
if not stack or s[i] == '(' or s[stack[-1]] == ')':
stack.append(i)
else:
stack.pop()
ans = max(ans,i-(stack[-1] if stack else -1))
return ans
首先,判断s是否为空,若为空直接返回0
然后闯将两个变量stack 和 ans=0
对字符串进行for循环,如果出现stack不为空,当前字符为左括号,或栈顶为有括号的情况,则将元素添加入stack栈中;如果stack为空,则stack直接弹出栈顶元素,对ans进行记录,找原ans与i-(stack[-1] if stack else -1 的值,这里面解释为如果栈顶元素为空,返回-1 若不为空,则stack[-1]为stack顶元素的索引。
最后返回ans
主要思想是:创建一个栈,不断向栈中加入左右括号,不断抵消,唯一关键是计算匹配括号的方法为总长度-未匹配留在栈中元素长度 = 匹配的长度 也就是剩余长度
另一种代码:
class Solution:
def longestValidParentheses(self, s: str) -> int:
n = len(s)
cs = list(s)
d = deque()
ans = 0
i, j = 0, -1
for i in range(n):
if cs[i] == '(':
d.append(i)
else:
if not d.empty():
d.pop()
top = j
if not d.empty():
top = d[-1]
ans = max(ans, i - top)
else:
j = i
return ans
看代码可以实现,但是自己想的话就不会了。难点感觉在于无法系统的掌控所有可能出现的情况。
知识积累
python中的入栈和出栈:入栈与出栈直接可以通过设置数组 对数组进行pop和append操作