有效的括号

85 阅读2分钟

有效的括号

说明

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true

示例 2:

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

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

来源:力扣(LeetCode) 链接:leetcode.cn/problems/va…

题解

解法一(8ms)

我自己的解法思想是:

  • 先把s字符串分解为一个数组

  • 然后创建一个 字符串str来作为 “栈”使用

  • 通过每次循环把每个字符保存在str中

  • 在每个保存的时候进行判断 如果 本次保存的是上一个字符所对应的符号就抵消掉 然后继续循环下去,知道结束

  • 当结束后str(栈)中还存在字符串就所以这个字符串中括号的位置是错误的

  • 例1:

    • ( [ ) ]
    • 第一次:str = ( 然后循环进来 [ ,因为(对应的符号不是[ 所以继续拼接
    • 第二次: str = ( [ 循环进来 ),因为 [ 对应的符号不是) 所以继续拼接
    • .....
    • 最后str = ( [ ) ] ,最后判断 str不为“”,那么这个字符串不合法 返回false;
  • 例2

    • ()[]{}
    • 第一次:str = ( 然后循环进来 ),( 对应的符号是 ) 所以把这两个符号都从str中去掉 str = "" ,然后把后面的字符放在str中
    • 第二次: str = [ ,循环进来 ] ,因为也是对应的 同上 str = "",然后把后面的字符放进来 str = {
    • 第三次同上
    • 最后str = "" ,说明这个字符串是合法的 返回true
  • 就像消消乐一样

    public static void main(String[] args) {
        //给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
        //有效字符串需满足:
        //左括号必须用相同类型的右括号闭合。
        //左括号必须以正确的顺序闭合。
        String s = "([)]";
        String s1 = "()[]{}";
        System.out.println(demo(s));
        System.out.println(demo(s1));
    }
​
    public static boolean demo(String s){
        String[] split = s.split("");
        if(split.length % 2 != 0){
            return false;
        }
        HashMap<String, String> map = new HashMap<>();
        map.put(")","(");
        map.put("]","[");
        map.put("}","{");
       
        StringBuilder str = new StringBuilder(split[0]);
        for (int i = 1; i < split.length; i++) {
            String substring = str.substring(str.length() - 1, str.length());
            String s1 = map.get(split[i]);
            if(substring.equals(s1)){
                if(0 != str.length() - 1){
                    str = new StringBuilder(str.substring(0, str.length() - 1));
                }else{
                    if(i + 1 < split.length){
                        str = new StringBuilder(split[i + 1]);
                        i++;
                    }else{
                        str = new StringBuilder();
                    }
                }
            }else{
                str.append(split[i]);
            }
        }
        return "".equals(str.toString());
    }

解法二 32ms(解法一的简写,只不过效率没有解法一快)

    public static void main(String[] args) {
        //给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
        //有效字符串需满足:
        //左括号必须用相同类型的右括号闭合。
        //左括号必须以正确的顺序闭合。       
        String s = "([)]";
        String s1 = "()[]{}";
        System.out.println(demo(s));
        System.out.println(demo(s1));
    }
​
    public static boolean demo(String s){
        int num = 1;
        while (num != 0){
            int length = s.length();
            s = s.replace("()","");
            s = s.replace("{}","");
            s = s.replace("[]","");
            if(length == s.length()){
                num = 0;
            }
        }
        return "".equals(s);
    }

解法三 1ms(力扣大佬写的,简单又快捷)

        Stack<Character>stack = new Stack<Character>();
        for(char c: s.toCharArray()){
            if(c=='(')stack.push(')');
            else if(c=='[')stack.push(']');
            else if(c=='{')stack.push('}');
            //只要栈不为空,并且不是 (,[,{ 就进行比较,不相同就直接返回错误
            else if(stack.isEmpty()||c!=stack.pop())return false;
        }
        return stack.isEmpty();