牛客网:有效括号序列

本文介绍了一种Java实现的方法,用于检查输入字符串中的括号是否构成有效序列。通过栈操作和映射表,展示了如何判断字符串如'([)]'的有效性。同时提供了三种不同的解决方案,包括使用HashMap、两个栈以及C++代码转换的Java实现。
package com.company.test.有效括号序列;

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

/**
 * @author xienl
 * @description 有效括号序列
 * @date 2022/5/17
 */

public class Solution {

    public static void main(String[] args) {
        String str = "([)]";
        System.out.println(isValid2(str));
    }


    /**
     * @param s string字符串
     * @return bool布尔型
     */
    public static boolean isValid(String s) {
        int len = s.length();

        // 如果说字符串不是偶数的话,那肯定不是一个有效的括号,就没有比较的必要了
        if (s.isEmpty() || len % 2 != 0) {
            return false;
        }

        // 初始化一个Hash表,用来记录所有可能发生的结果
        Map<Character, Character> map = new HashMap<Character, Character>(len / 2) {{
            put(')', '(');
            put(']', '[');
            put('}', '{');
        }};

        char[] chars = s.toCharArray();
        Stack<Character> stack = new Stack<>();
        Stack<Character> stack2 = new Stack<>();

        // 把每一个字符放到栈里面去
        for (char c : chars) {
            stack.push(c);
        }

        while (!stack.isEmpty()) {
            Character char1 = stack.pop();
            if (!map.containsKey(char1)){
                return false;
            }

            Character char2;
            while (!stack.isEmpty() && !(char2 = stack.pop()).equals(map.get(char1))){
                if (map.containsKey(char2)){
                    stack2.push(char1);
                    char1 = char2;
                    continue;
                }

                if (!char2.equals(map.get(char1))){
                    return false;
                }

            }

            // 把第二个栈里面的元素再加回第一个栈中
            while (!stack2.isEmpty()){
                stack.push(stack2.pop());
            }
        }
        return true;
    }

    /*** 题解答案
     *  @param s string字符串
     * @return bool布尔型
     */
    public static boolean isValid2(String s) {
        int len = s.length();

        // 如果说字符串不是偶数的话,那肯定不是一个有效的括号,就没有比较的必要了
        if (s.isEmpty() || len % 2 != 0) {
            return false;
        }
        char[] chars = s.toCharArray();
        Stack<Character> stack = new Stack<>();

        for (char aChar : chars) {
            if (aChar == '{' || aChar == '[' || aChar == '('){
                stack.push(aChar);
                continue;
            }

            if (stack.isEmpty() || !isMatch(aChar, stack.pop())){
                return false;
            }

        }
        return stack.isEmpty();
    }

    /**
     * 括号是否匹配
     * @return
     */
    public static boolean isMatch(char char2, char char1){
        if (char1 == '{'){
            return char2 == '}';
        }

        if (char1 == '['){
            return char2 == ']';
        }

        if (char1 == '('){
            return char2 == ')';
        }
        return false;
    }

    /**
     * 第一名的C++代码转Java代码
     * @param s
     * @return
     */
    public static boolean isValid3(String s){
        // write code here
        Stack<Character> st = new Stack<>();
        int n = s.length();
        for(int i=0;i<n;i++){
            if (!st.empty() && ((s.charAt(i) == ']' && st.peek()=='[') || ((s.charAt(i) == '}' && st.peek()=='{')|| ((s.charAt(i) == ')' && st.peek()=='('))))) {
                st.pop();
            } else {
                st.push(s.charAt(i));
            }
        }
        return st.empty();
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值