检查符号是否成对出现

检查符号是否成对出现

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

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 比如 “()”、"()[]{}"、"{[]}" 都是有效字符串,而 “(]” 、"([)]" 则不是。
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

/**
 * @author LanceQ
 * @version 1.0
 * @time 2021/5/14 22:09
 */
public class isValidDemo {
    public static void main(String[] args) {
        String s="()[]{}";
        String s1="{[]}";
        String s2="(]";
        String s3="([)]";
        String s4=")]";
        System.out.println(isValid(s));
        System.out.println(isValid(s1));
        System.out.println(isValid(s2));
        System.out.println(isValid(s3));
        System.out.println(isValid(s4));
    }
    private static boolean isValid(String s) {
        Map<Character, Character> map = new HashMap<>();
        map.put(')','(');
        map.put(']','[');
        map.put('}','{');
        Stack<Character> stack = new Stack<>();
        int len=s.length();
        char[] c= s.toCharArray();
        for (int i = 0; i < len; i++) {
            if(map.containsKey(c[i])){
                char ch=stack.isEmpty() ? '#':stack.pop();
                if(!map.get(c[i]).equals(ch)){
                    return false;
                }
            }else{
                stack.push(c[i]);
            }
        }
//        for (int i = 0; i < len; i++) {
//            if(map.containsKey(s.charAt(i))){
//                char ch=stack.isEmpty() ? '#':stack.pop();
//                if(!map.get(s.charAt(i)).equals(ch)){
//                    return false;
//                }
//            }else{
//                stack.push(s.charAt(i));
//            }
//        }
        return stack.isEmpty();
    }
}

  1. 首先我们将括号间的对应规则存放在 Map 中,用于下方遍历的时候,进行判断;
  2. 创建一个栈拥有存储左括号,因为一个左括号后面可能还是左括号,所以要创建stack来存储;
  3. 然后把String类型转换成char类型来获取每一个字符,不转换可以,可以通过s.charAt(i)来获取每一个字符;
  4. 遍历判断该元素是否是右边类型的括号,如果符合条件的话,前面一定有左边类型的括号被压进栈中,这个时候,只需要从栈中该前一个元素弹出来进行比较即可;
  5. 不过,要注意的是,有可能一开始就是右边类型的括号,前面没有压进左边类型的括号,所以在弹出括号的时候,就需要进行判断栈是否为空,为空的话,就随便设置一个字符进行赋值,只需要和左括号类型不一样就行了。如果不进行判断的话,就有报空栈异常“Exception in thread “main” java.util.EmptyStackException”。
  6. 最后返回判断栈是否为空就可以了,因为如果括号都是成对出现的话,栈里面的元素肯定会全部压出,这个时候一定为空,如果不是成对存在的话,栈就一定不为空,返回的是false。

参考:https://leetcode-cn.com/problemset/all/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值