LeetCode之栈(11)

 

 

 

我今天才知道,我之所以漂泊就是在向你靠近。_数据结构

 

 

    

    0.说在前面

    1.有效的括号

    2.作者的

 

 

0.说在前面

“旧梦是好梦。它没有实现,但是我很高兴我有过这些梦。”

我的梦在哪里,在LeetCode!

关于LeetCode刷题,与老表建立的微信群,目前已经坚持一个月了,收获很多,昨天跟老表沟通后,公开所有读者进群,只要你能够坚持刷题,坚持分享,便可以共同进步!

我今天才知道,我之所以漂泊就是在向你靠近。

又到了周二时间,今天来讨论的是LeetCode上的题目,今天主要以三种方法来刷一道非常简单的题目,有效的括号问题!

昨天的泰坦尼克号后面陆续更新。

 

 

1.有效的括号

【问题】

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。

  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例 1:

 

输入: "()"
输出: true

示例 2:

 

输入: "()[]{}"
输出: true

【方法一】

思想

这道题最关键是理解什么是括号匹配!

对于本道题的括号匹配实际上为只要连续两个括号为一组,则需要把当前一组删除掉继续判断!

这里说的连续两个括号:意思为,例如:([]),这种肯定为True,内部[]连续并构成一组,那么我们需要把当前的一组删除,然后继续判断,会发现后面的括号与前面也构成一组(),然后就为True!

对于这道题,在考研阶段看的两本书:王道与天勤数据结构上,明确提到过对于括号问题,采用的数据结构为栈!

在这里我们也是用栈,只不过用的python实现。

这里的数据结构,我定义为:

 

# 栈中元素初始化
stack_len=0
# 栈数据结构直接设为list
stack=[]

然后,只要是左括号或者说前括号,就入栈,否则出栈,记得最后判断栈中元素是否为空。

算法

 

class Solution:
    def isValid(self, s):
        # 栈中元素初始化
        stack_len=0
        # 栈数据结构直接设为list
        stack=[]
        for i in s:
            # 前括号入栈
            if i=='(' or i=='{' or i=='[':
                stack_len+=1
                stack.append(i)
            # 后括号匹配
            else:
                if stack and i==')' and stack[-1]=='(':
                    stack.pop()
                    stack_len-=1
                elif stack and i=='}' and stack[-1]=='{':
                    stack.pop()
                    stack_len-=1
                elif stack and i==']' and stack[-1]=='[':
                    stack.pop()
                    stack_len-=1
                '''
                下面这两行非常重要!
                主要用于判别当栈中没有元素进来是后面的符号,
                或者是栈有元素,但是不匹配,那么直接返回False即可!
                '''
                else:
                    return False
        # 栈空为True,否则False
        return stack_len==0
s = Solution()
t = "(]"
res = s.isValid(t)
print(res)

复杂度

时间复杂度:O(n);空间复杂度:O(n),由于使用了栈存储元素,故最多为O(n)!

击败99.06%,基本完美!

我今天才知道,我之所以漂泊就是在向你靠近。_括号匹配_02

【方法二】

思想

采用的数据结构同上,对上述算法进行改进,不同之处,使用字典提前存储括号!

算法

 

class Solution:
    def isValid(self, s):
        stack_match = {'{':'}','[':']','(':')'}
        stack=[]
        for str in s:
            if str == '{' or str == '[' or str== '(':
                stack.append(str)
            else:
                # 无左括号,只有右括号,直接返回False
                if len(stack)==0:
                    return False
                # 栈顶元素对应的字符串是否匹配当前字符
                if stack_match[stack.pop()]!=str:
                    return False
        flag = True if len(stack)==0 else False
        return flag
s = Solution()
t = "{[]}"
res = s.isValid(t)
print(res)

击败99.06%,基本完美!

我今天才知道,我之所以漂泊就是在向你靠近。_括号匹配_02

复杂度

同方法一

【方法三】

思想

也是用的栈数据结构思想,不同之处是字典括号,key与value设置不同。

算法

参考自:https://www.jianshu.com/p/f67fab550282

 

class Solution:
    def isValid(self,s):
        dict = {')': '(', '}': '{', ']': '['}
        l = [None]
        for i in s:
            if i in dict and dict[i] == l[-1]:
                l.pop()
            else:
                l.append(i)
        return len(l) == 1

复杂度

同上述两个算法!

但是,测试的结果没前两个好….

击败76.55%,还可以!

我今天才知道,我之所以漂泊就是在向你靠近。_字符串_04

 

 

 

 

 

我今天才知道,我之所以漂泊就是在向你靠近。_括号匹配_05

 

我今天才知道,我之所以漂泊就是在向你靠近。

--《廊桥遗梦》