一、题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
 左括号必须以正确的顺序闭合。
 每个右括号都有一个对应的相同类型的左括号。
  
示例 1:
输入:s = "()"
 输出:true
 示例 2:
输入:s = "()[]{}"
 输出:true
 示例 3:
输入:s = "(]"
 输出:false
  
提示:
1 <= s.length <= 104
 s 仅由括号 '()[]{}' 组成
二、题解
解1:普通方法(通过10%的测试用例)
class Solution:
    def isValid(self, s: str) -> bool:
        flag = 0
        l = len(s)
        for i in range(0,l,2):
            if  s[i] == '(' and s[i+1]==')':
                flag += 1
            if  s[i] == '[' and s[i+1]==']':
                flag += 1
            if  s[i] == '{' and s[i+1]=='}':
                flag += 1
        
        if flag == l//2:
            return True
        else:
            return False
       
 
解2:使用字典计数(通过80%的测试用例)
class Solution:
    def isValid(self, s: str) -> bool:
 
        dict = {
            "(":0,
            ")":0,
            "{":0,
            "}":0,
            "[":0,
            "]":0
        }
        for i in range(len(s)):
            dict[s[i]]+=1
        if dict["("] == dict[")"] and  dict["["] == dict["]"] and  dict["{"] == dict["}"]:
            return True
        else:
            return False
        
         
解3:使用栈数据结构的性质(通过所有测试用例)
class Solution:
    def isValid(self, s: str) -> bool:
        # 创建一个字典,其中键为右括号,值为对应的左括号
        dic = {')':'(',']':'[','}':'{'}
        # 创建一个空栈用于存储左括号
        stack = []
        # 遍历输入的字符串中的每个字符
        for i in s:
            # 如果栈不为空且当前字符是右括号
            if stack and i in dic:
                # 检查栈顶元素是否与当前字符所对应的左括号匹配
                if stack[-1] == dic[i]:
                    # 如果匹配,将栈顶的左括号出栈
                    stack.pop()
                else:
                    # 如果不匹配,返回False,表示括号无效
                    return False
            else:
                # 如果栈为空或者当前字符是左括号,将当前字符压入栈中
                stack.append(i)
        # 最后,判断栈是否为空,为空则表示括号有效,返回True,否则返回False
        return not stack
解4使用链表栈完成题解(通过100%)
当然,我可以给你提供一个使用链表实现栈的解决方案,以判断字符串是否有效。
首先,我们需要定义一个链表节点类 `Node` 来表示栈中的每个节点。每个节点包含一个值和指向下一个节点的指针。
```python
 class Node:
     def __init__(self, value):
         self.value = value
         self.next = None
 ```
然后,我们定义链表栈类 `Stack` 来实现栈的基本操作。栈中有两个重要的属性:栈顶节点 `top` 和栈的大小 `size`。栈的大小可以帮助我们判断是否为空栈。
```python
 class Stack:
     def __init__(self):
         self.top = None
         self.size = 0
    def push(self, value):
         new_node = Node(value)
         if not self.top:
             self.top = new_node
         else:
             new_node.next = self.top
             self.top = new_node
         self.size += 1
    def pop(self):
         if self.isEmpty():
             return None
         else:
             popped_value = self.top.value
             self.top = self.top.next
             self.size -= 1
             return popped_value
    def isEmpty(self):
         return self.size == 0
 ```
现在,我们可以使用链表栈来判断字符串的有效性。遍历字符串的每个字符,当遇到左括号时,将其入栈;当遇到右括号时,判断栈是否为空,或者栈顶的左括号与当前右括号不匹配,则返回 False。最后,检查栈是否为空,如果为空,则表示所有的括号都有效,返回 True。
```python
 def isValid(s):
     stack = Stack()
     mapping = {')': '(', ']': '[', '}': '{'}
     for char in s:
         if char in ['(', '[', '{']:
             stack.push(char)
         elif char in [')', ']', '}']:
             if stack.isEmpty() or stack.pop() != mapping[char]:
                 return False
     return stack.isEmpty()
 ```
class Node:
    def __init__(self, value):
        self.value = value
        self.next = None
class Stack:
    def __init__(self):
        self.top = None
        self.size = 0
    def push(self, value):
        new_node = Node(value)
        if not self.top:
            self.top = new_node
        else:
            new_node.next = self.top
            self.top = new_node
        self.size += 1
    def pop(self):
        if self.isEmpty():
            return None
        else:
            popped_value = self.top.value
            self.top = self.top.next
            self.size -= 1
            return popped_value
    def isEmpty(self):
        return self.size == 0
class Solution:
    def isValid(self, s: str) -> bool:
        stack = Stack()
        mapping = {')': '(', ']': '[', '}': '{'}
        for char in s:
            if char in ['(', '[', '{']:
                stack.push(char)
            elif char in [')', ']', '}']:
                if stack.isEmpty() or stack.pop() != mapping[char]:
                    return False
        return stack.isEmpty()
 
 
三、知识点扩展
在Python中,栈可以使用以下两种方式实现:
1. 列表(List)实现栈:
    Python的内置类型列表(List)可以方便地用作栈数据结构。可以使用`append()`方法将元素添加到列表的末尾,使用`pop()`方法从列表的末尾移除元素。
 
   示例代码:
  
  ```python
   stack = []  # 创建一个空栈
   stack.append(1)  # 入栈操作
   stack.append(2)
   stack.append(3)
   top_element = stack.pop()  # 出栈操作,返回被弹出的元素
   print(top_element)  # 输出: 3
   ```2. 链表(LinkedList)实现栈:
    如果想要更加灵活地实现栈,还可以使用自定义的链表结构来实现。链表实现栈的主要优点是在入栈和出栈操作中具有 O(1) 的时间复杂度。   示例代码:
  
 
 ```python
   class Node:
       def __init__(self, val):
           self.val = val
           self.next = None
   class Stack:
       def __init__(self):
           self.top = None
       def push(self, val):
           new_node = Node(val)
           new_node.next = self.top
           self.top = new_node
       def pop(self):
           if self.isEmpty():
               return None
           popped_val = self.top.val
           self.top = self.top.next
           return popped_val
       def isEmpty(self):
           return self.top is None
   stack = Stack()  # 创建一个空栈
   stack.push(1)  # 入栈操作
   stack.push(2)
   stack.push(3)
   top_element = stack.pop()  # 出栈操作,返回被弹出的元素
   print(top_element)  # 输出: 3
   ```使用列表实现栈更为简单和高效,因此在Python中通常更常用。但是,当需要更多灵活性和控制时,可以选择实现自己的链表结构作为栈。
希望这个回答对你有所帮助。如果有任何进一步的问题,请随时提问。



















