老规矩先把题目放出来:
Given a string containing just the characters '('
and ')'
, find the length of the longest valid (well-formed) parentheses substring.
举一个例子:
Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"
题目分析:
以往我们判断字符串是否符合Parentheses规则,是通过压栈的形式。那么我们同样需要思考这里我是否也可以通过压栈的方式去寻求最长符合规则的字符串。答案是可以的。这里我们需要深入思考压栈的过程。假设我们压栈结束后,我们的栈里面剩余的元素的index是[2, 6, 9](str_length = 10), 我们可以得出0:2, 2:6, 6:9, 9:10构成了四个符合规则的字符串。这里面也就是说两个没有出栈连续的元素之间出栈的元素可以构成符合规则的字符串。也就是说我们压栈完成的时候我们其实已经可以得出最长的规则字符串了。
算法设计:
- 初始化stack
- 压栈(为了计算长度方便,进入index而不是元素本身),出栈(出栈规则:如果栈顶两个元素构成()就出栈)
- 计算stack剩余index之间的差
- 返回最大值
class Solution:
def longestValidParentheses(self, s):
"""
:type s: str
:rtype: int
"""
stack = []
for i in range(len(s)):
stack.append(i)
if len(stack) > 1 and (s[stack[-2]] == '(' and s[stack[-1]] == ')'):
stack.pop()
stack.pop()
if len(stack) == 0:
return len(s)
stack.insert(0, -1)
stack.append(len(s))
biggest = 0
for i in range(len(stack) - 1):
gap = stack[i + 1] - stack[i] - 1
if gap > biggest:
biggest = gap
return biggest
结果accepted,beat了70%的人。
代码优化:
计算stack之间的gap这一步可以在压栈的过程中实现,因为我们可以知道一个连续出栈过程如果中断了那么连续的个数就是gap,我们可以记录下来,这个留给读者自己实现。
提交记录和修改:
我提交了两次,第一次没有通过是因为stack.insert(0, 0)这一步是错的最后我改成了insert(0, -1)
备注:
如果你喜欢我的讲解,请留言和我一起交流。