ValidParentheses --leetCode

本文介绍了一种算法,用于检查包含括号的字符串是否有效。通过三种不同的方法实现:使用栈进行匹配、利用哈希映射和递归删除配对括号。这些方法适用于编程面试和技术挑战。
package com.helloxin.leetcode.algorithms;

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

/**
 * create by nandiexin on 2017/12/13
 **/
public class ValidParentheses {

    /**
     *  Given a string containing just the characters '(', ')', '{', '}', '[' and ']',
     *  determine if the input string is valid.
        The brackets must close in the correct order,
        "()" and "()[]{}" are all valid but "(]" and "([)]" are not.
     */

    public static boolean isValid(String s) {


        boolean isValid = false;
        Stack<Character> stack = new Stack<>();
        if(null != s && !s.isEmpty()){

            for (int i = 0; i < s.length(); i++) {
                char a = s.charAt(i);
                //判断是否存在其他字符
                if(a != '(' && a == '[' && a == '{' && a != ')' && a == ']' && a == '}'){
                    break;
                }
                if(stack.isEmpty()){
                    stack.push(a);
                    continue;
                }
                if(a == '(' || a == '[' || a == '{'){
                    stack.push(a);
                }else if(a == ')'){
                    char b = stack.peek();
                    if (b != '('){
                        break;
                    }
                    stack.pop();
                }
                else if(a == ']'){
                    char b = stack.peek();
                    if (b != '['){
                        break;
                    }
                    stack.pop();
                }else if(a == '}'){
                    char b = stack.peek();
                    if (b != '{'){
                        break;
                    }
                    stack.pop();
                }
            }
        }
        if(stack.size() ==0 ){
            isValid = true;
        }
        return isValid;
    }

    /**
     * 下面看的其他人写的   但是 这里没做 其他字符的控制
     */
    public static boolean isValid2(String s) {
        Map<Character, Character> map = new HashMap<Character, Character>();
        map.put('(',')');
        map.put('[',']');
        map.put('{','}');
        Stack<Character> stk = new Stack<Character>();
        for(int i = 0; i < s.length(); i++){
            Character c = s.charAt(i);
            switch(c){
                case '(': case '[': case '{':
                    stk.push(c);
                    break;
                case ')': case ']': case '}':
                    if(stk.isEmpty() || c != map.get(stk.pop())){
                        return false;
                    }
            }
        }
        return stk.isEmpty();
    }
    //好吧 ,其实我是不愿意这么写的
    public static boolean isValid3(String s) {

        int len = s.length();
        if(len==0) return true;
        if(len%2 == 1) return false;
        for(int i = 1; i < len; i++)
            if(s.charAt(i-1) == '{' && s.charAt(i)=='}')
            {
                String ss = s.substring(0, i-1) + s.substring(i+1);
                return isValid(ss);
            }
            else if(s.charAt(i-1) == '[' && s.charAt(i)==']')
            {
                String ss = s.substring(0, i-1) + s.substring(i+1);
                return isValid(ss);
            }
            else if(s.charAt(i-1) == '(' && s.charAt(i)==')')
            {
                String ss = s.substring(0, i-1) + s.substring(i+1);
                return isValid(ss);
            }
        return false;
    }


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

转载于:https://my.oschina.net/u/2277632/blog/1589214

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值