Skip to content

Latest commit

 

History

History
113 lines (89 loc) · 2.37 KB

20.有效的括号.md

File metadata and controls

113 lines (89 loc) · 2.37 KB

20. 有效的括号

url

题目

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。

输入: "()"
输出: true

输入: "()[]{}"
输出: true

输入: "(]"
输出: false

输入: "([)]"
输出: false

输入: "{[]}"
输出: true

方法

栈的思想

  • 遍历字符串
  • 当前栈的空间长度为0,则直接将该字符串c添加到空间中
  • 如果栈空间长度不为0,就意味着有其他字符串,将c与上一个入栈的字符进行isSym进行匹配,如果满足则,将上一个入栈的字符串移除
  • 如果不满足以上两个条件,则将c入栈

code

js

let isValid = s => {
    let isSym = (c1, c2) => {
        return (c1 === '(' && c2 === ')')
            || (c1 === '{' && c2 === '}')
            || (c1 === '[' && c2 === ']')
    }

    let stack = []

    for (let i = 0; i < s.length; i++) {
        let c = s[i];
        if (stack.length === 0) {
            stack.push(c);
        } else if (isSym(stack[stack.length - 1], c)) {
            stack.pop();
        } else {
            stack.push(c);
        }
    }
    return stack.length === 0;
};

go

func isValid(s string, i int, j int) bool {
	// 栈
	var stack []string
	isSym := func (c1, c2 string) bool {
		return (c1 == "(" && c2 == ")") || (c1 == "{" && c2 == "}") || (c1 == "[" && c2 == "]")
	}
	for _, c := range s {
		if stack == nil || len(stack) == 0 || !isSym(stack[len(stack)-1], string(c)) {
		 	stack = append(stack, string(c))
		} else {
			stack = stack[:len(stack) - 1]
		}
	}
	return len(stack) == 0
}

java

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()){
            if (stack.isEmpty())
                stack.push(c);
            else if(isSym(stack.peek(), c))
                stack.pop();
            else    
                stack.push(c);
        }
        return stack.isEmpty();
    }

    private boolean isSym(char c1, char c2) {
        return (c1 == '(' && c2 == ')')
            || (c1 == '{' && c2 == '}')
            || (c1 == '[' && c2 == ']');
    }
}