关于LeetCode中Valid Parentheses一题的理解

题目如下:

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.

    这道题也是想了很久,今天走路的时候突然想到可以用压栈弹栈的方式来实现,就马上去LeetCode把它撸完了,下面是已Accepted的代码:

    public boolean isValid(String s) {
        Stack<String> stack = new Stack<String>();
        for(int i=0;i<s.length();i++){
            char candidate = s.charAt(i);
            if(candidate=='{'||candidate=='['||candidate=='('){
                stack.push(candidate+"");
            }else{
                if(stack.isEmpty()){
                    return false;
                }
                if((candidate=='}' && stack.peek().equals("{"))||
                (candidate==']' && stack.peek().equals("["))||
                (candidate==')' && stack.peek().equals("("))){
                    stack.pop();
                }else{
                    return false;
                }
            }
        }
        if(stack.isEmpty()){
            return true;
        }else{
            return false;
        }
    }
    题目的解题思路如下:

(1)如果发现是输入'{','[','('是这三种之中的一种,就直接把它们压入栈中;

(2)如果输入为'}',']',')'就需要获取栈顶的元素,如果能和这三种匹配上就直接把它探出,即如果输入为‘}’就查看栈顶元素,如果是'{'就将'{'弹出,否则返回false;

(3)如果循环结束后,栈中还存在元素,就说明有未匹配的项,应当返回false,反之则返回true。

    然后是评论区的回答,下面这个方法也是使用了“栈”,但是快一些,思路是一样的,代码如下:

	public boolean isValid(String s) {
		char[] stack = new char[s.length()];
		int head = 0;
		for(char c : s.toCharArray()) {
			switch(c) {
				case '{':
				case '[':
				case '(':
					stack[head++] = c;
					break;
				case '}':
					if(head == 0 || stack[--head] != '{') return false;
					break;
				case ')':
					if(head == 0 || stack[--head] != '(') return false;
					break;
				case ']':
					if(head == 0 || stack[--head] != '[') return false;
					break;
			}
		}
		return head == 0;
	}
    依然来自评论区,思路一样,但是更精辟些,代码如下:

public boolean isValid(String s) {
	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() || stack.pop() != c)
			return false;
	}
	return stack.isEmpty();
}
    大致就是这样。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值