20. Valid Parentheses

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

有效字符串需满足:

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

注意空字符串可被认为是有效字符串。

package com.zhr.stack;

import com.zhr.exception.CodeException;

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

/**
 * @ Author     :zhenghaoran.
 * @ Date       :Created in 15:43 2019/1/21
 * @ Description:
 * 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
 * <p>
 * 有效字符串需满足:
 * <p>
 * 左括号必须用相同类型的右括号闭合。
 * 左括号必须以正确的顺序闭合。
 * 注意空字符串可被认为是有效字符串。
 */
public class ValidParentheses {

    public static Map<Character,Character> map = new HashMap();

    static{
        map.put(')','(');
        map.put(']','[');
        map.put('}','{');
    }

    /**
     * 只要有 '(',')' 小中大括号在一起的就 变成 "" 空串
     *
     * @param s
     * @return
     */
    public static boolean isValid(String s) {
        int length;
        do {
            length = s.length();
            s = s.replace("()", "").replace("[]", "").replace("{}", "");
        } while (length != s.length());
        return s.length() == 0;
    }

    /**
     * 使用Stack的栈结构,如果是([{ 就放入堆当中,如果是)]}则看堆顶是否有之匹配,如果有则pop,最好要检查Stack是否为空
     *
     * @param s
     * @return
     */
    public static boolean isValidTwo(String s) throws CodeException {
        char[] chs = s.toCharArray();
        Stack<Character> stack = new Stack<Character>();
        for (int i = 0; i < chs.length; i++) {
            if (chs[i] == '{' || chs[i] == '[' || chs[i] == '(') {
                stack.add(chs[i]);
            }
            if (chs[i] == '}' || chs[i] == ']' || chs[i] == ')') {
                char match = chs[i] == '}' ? '{' : (chs[i] == ']' ? '[' : '(');
                if (stack.isEmpty() || !stack.pop().equals(match)) {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }

    /**
     * 优化 使用map
     * @param s
     * @return
     * @throws CodeException
     */
    public static boolean isValidThree(String s) throws CodeException {
        char[] chs = s.toCharArray();
        Stack<Character> stack = new Stack<Character>();
        for(int i = 0;i < chs.length; i++){
            if(!map.containsKey(chs[i])){
                stack.push(chs[i]);
            }else if(!stack.empty() && map.get(chs[i]) != stack.pop()) {
                return false;
            }
        }
        return stack.empty();
    }

    public static void main(String[] args) throws CodeException {
        String str1 = "()[]{}";
        String str2 = "()";
        String str3 = "(]";
        String str4 = "([)]";
        String str5 = "{[]}";
        String str6 = "((()())";
        String str7 = ")(";

        boolean valid1 = isValidThree(str1);
        boolean valid2 = isValidThree(str2);
        boolean valid3 = isValidThree(str3);
        boolean valid4 = isValidThree(str4);
        boolean valid5 = isValidThree(str5);
        boolean valid6 = isValidThree(str6);
        boolean valid7 = isValidThree(str7);
        System.out.println(valid1);
        System.out.println(valid2);
        System.out.println(valid3);
        System.out.println(valid4);
        System.out.println(valid5);
        System.out.println(valid6);
        System.out.println(valid7);

    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值