题目描述:
    给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。
    有效字符串需满足:
    1.左括号必须用相同类型的右括号闭合。
    2.左括号必须以正确的顺序闭合。
    注意:空字符串可被认为是有效字符串。

    题目示例:
    示例 :
    输入: “()”
    输出: true
    输入: “()[]{}”
    输出: true
    输入: “([)]”
    输出: false
    输入: “{[]}”
    输出: true

    做题思路一:
    在“有效的括号”中,不论是 () 还是 [] 还是 {},肯定都是成对出现的,不会有半边括号出现,所以我们只需要用 replace() 方法将字符串中的 ()[]{} 全部替换成空字符串 '' 即可。如果将全部成对出现的括号全部替换为空字符串的话,字符串的长度应该为 0 。如果不为 0 说明字符串不是一个 “有效的括号” 字符串。

    做题思路二:
    关于这道题我们可以用 这个数据结构来做。我们知道栈是后进先出的数据结构,这样的特性方便我们进行左右括号的对比,先来看下大体的思路:

    1. 遍历整个字符串,如果是左括号就入栈;
    2. 如果是右括号则查看当前栈顶元素是否与之相匹配,如果不匹配直接返回 false;
    3. 遍历完成之后,如果栈内没有元素则说明全部匹配成功,返回 true;如果栈内还有元素则说明不匹配,返回 false,其实直接 return stack == 0 就行。

    代码一:
    class Solution {
    /*
    无限循环,每次将成对的括号替换为空字符串
    如果替换之前和替换之后的长度一样,说明没有成对的字符串,或者字符串为空字符串,跳出循环体
    如果替换之前和替换之后的长度不一样,说明有成对的字符串被替换掉,继续循环替换成对的字符串
    直到替换之前和替换之后的长度一样,跳出循环体为止
    最后判断字符串的长度是否为 0 来判断字符串是否是有效的括号
    @param s
    @return
    */
    public boolean isValid(String s) {
    int length;
    while (true) {
    length = s.length();
    s = s.replace(“()”,””);
    s = s.replace(“[]”,””);
    s = s.replace(“{}”,””);
    if (length == s.length()) {
    break;
    }
    }
    return length == 0;
    }
    }

    代码二:
    class Solution {
    public boolean isValid(String s) {
    Stack stack = new Stack<>();
    for (int i = 0; i < s.length(); i++) {
    // 如果是左括号就入栈
    if (s.charAt(i) == ‘{‘|| s.charAt(i) == ‘[‘ || s.charAt(i) == ‘(‘) {
    stack.push(s.charAt(i));
    }
    // 如果是右括号就判断栈是否为空,以及栈顶是否和右括号匹配,如果不匹配直接可以返回 false
    if (s.charAt(i) == ‘]’) {
    if (stack.isEmpty() || stack.peek() != ‘[‘) {
    return false;
    }
    stack.pop();
    }
    if (s.charAt(i) == ‘}’) {
    if (stack.isEmpty() || stack.peek() != ‘{‘) {
    return false;
    }
    stack.pop();
    }
    if (s.charAt(i) == ‘)’) {
    if (stack.isEmpty() || stack.peek() != ‘(‘) {
    return false;
    }
    stack.pop();
    }
    }
    // 如果全部匹配,则栈为空,否则不为空
    return stack.isEmpty();
    }
    }