LeetCode 有效括号相关三题

162 阅读1分钟

最近看到阿里的机试题有一道括号问题,所以自己找了三题做了一下

ps. 三题最开始用栈做始终不能兼容初始和后续累加,,看了参考答案,初始压栈-1太绝了

20.有效的括号

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

有效字符串需满足:

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

class Solution {
    public boolean isValid(String s) {
       // 奇数直接返回false
       if(s.length() % 2 > 0){
           return false;
       }
       int l = s.length() / 2;
       for(int i = 0; i < l; i++){
           s = s.replace("()","").replace("[]","").replace("{}","");
       }
       return s.length() == 0;
    }
}

678.有效的括号字符串

给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:

任何左括号 ( 必须有相应的右括号 )。 任何右括号 ) 必须有相应的左括号 ( 。 左括号 ( 必须在对应的右括号之前 )。 * 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。 一个空字符串也被视为有效字符串。

class Solution {
    public boolean checkValidString(String s) {
        Stack<Integer> _l = new Stack();
        Stack<Integer> _s = new Stack();
        char[] chars = s.toCharArray();
        for(int i = 0; i< chars.length; i++){
            if(chars[i] == '(') _l.push(i);
            if(chars[i] == '*') _s.push(i);
            if(chars[i] == ')'){
                if(!_l.empty()){
                    _l.pop();
                }else if(!_s.empty()){
                    _s.pop();
                }else {
                    return false;
                }
            }
        }
        if(!_l.empty()){
            int size = _s.size();
            for(int i  = 0; i< size; i++){
                if(!_l.empty() && _s.peek() >_l.peek()){
                    _s.pop();
                    _l.pop();
                }
            }
        }
        if(_l.empty()) return true;
        return false;
    }
}

32.最长的有小括号

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

class Solution {
    public int longestValidParentheses(String s) {
        char[] chars = s.toCharArray();
        Stack<Integer> _l = new Stack();
        int len = 0;
        int mLen = 0;
        _l.push(-1);
        for(int i = 0; i < chars.length; i++){
            if(chars[i] == '(') _l.push(i);
            if(chars[i] == ')'){
                _l.pop();
                if(_l.empty()) _l.push(i);
                else {
                    mLen = mLen < i - _l.peek() ? i - _l.peek() : mLen;
                }
            }
        }
        return mLen;
    }
}

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。