LeetCode 20. 有效的括号

Posted xiaoXingcode-go

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 20. 有效的括号相关的知识,希望对你有一定的参考价值。

题目链接:LeetCode 20. 有效的括号

题意:

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

解题思路:

括号匹配是栈的经典应用场景,具体操作如下:
1. 对于所有的左括号,进栈
2. 对于所有的右括号,弹出栈顶元素,判断是否与当前元素匹配,若不匹配,则return false
3. 最后判断栈中是否还有元素,如果还有剩余元素,则说明有多余括号,不匹配

完整代码如下:


func isValid(s string) bool 
    ss:=[]rune(s)
    n:=len(ss)
    if n % 2 == 1
        return false
    
    var st []rune
    for i:=0;i<n;i++
        if ss[i] == \'(\' || ss[i] == \'\' || ss[i] == \'[\'
            //入栈
            st = append(st,ss[i])
        else
            m:=len(st)
            if m == 0
                return false
            
            tmp := st[m-1]
            st = st[:m-1]
            if ss[i] == \'\' && tmp != \'\' || ss[i] == \')\' && tmp != \'(\' || ss[i] == \']\' && tmp != \'[\'
                return false
            
        
    
    k:=len(st)
    return k==0 

也可以结合map简化操作,代码如下:

func isValid(s string) bool 
    hash := map[byte]byte\')\':\'(\', \']\':\'[\', \'\':\'\'
    stack := make([]byte, 0)
    if s == "" 
        return true
    

    for i := 0; i < len(s); i++ 
        if s[i] == \'(\' || s[i] == \'[\' || s[i] == \'\' 
            stack = append(stack, s[i])
         else if len(stack) > 0 && stack[len(stack)-1] == hash[s[i]] 
            stack = stack[:len(stack)-1]
         else 
            return false
        
    
    return len(stack) == 0

LeetCode - 20 :有效的括号

原题目:

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

解题思想:

通过观察可以发现,有效的括号都至少具有一组左括号和右括号相邻的情况,然后可以将这一部分由相邻左右括号构成的子串去掉,判断剩下部分的有效性。(这一点就像自己计算数学题一样,一般都是先计算最深层的括号,然后得到数之后,再计算下一层的括号,直到最后一层),具体解题思路如下:

1、构建右括号和左括号之间的映射;

2、建立一个栈,遍历字符串,遇到左括号将其放到栈里面,遇到右括号,根据步骤1中的映射关系,判断栈顶的括号是否与该右括号构成有效括号,如果不构成,直接返回false,如果是有效的,弹出栈顶元素,继续遍历;(栈数据结构是后进先出,因此用栈来存储已遍历的括号字符)

3、判断最终栈是否为空,如果不为空,则不是有效括号。

题解:

 1 class Solution {
 2     public static boolean isValid(String s) {
 3         HashMap<Character , Character> maps = new HashMap<>();
 4         int len = s.length();
 5         if(len % 2 != 0) return false; //长度为奇数,直接返回false
 6         maps.put(‘)‘, ‘(‘);
 7         maps.put(‘}‘, ‘{‘);
 8         maps.put(‘]‘, ‘[‘);
 9         Stack<Character> stack = new Stack<Character>();
10         for (int i = 0; i < s.length(); i++) {
11             char c = s.charAt(i);
12             if (maps.containsKey(c)) {
13                 char topElement = stack.empty() ? ‘#‘ : stack.pop();
14                 if (topElement != maps.get(c)) {
15                     return false;
16                 }
17             } else {
18                 stack.push(c);
19             }
20         }
21         return stack.isEmpty();
22     }
23 }

 

以上是关于LeetCode 20. 有效的括号的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 20. 有效的括号

LeetCode - 20 :有效的括号

python刷LeetCode:20. 有效的括号

leetcode-20-有效的括号

LeetCode 20. 有效的括号(Valid Parentheses)

[LeetCode]20 Valid Parentheses 有效的括号