leetcode打卡day15

有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()” 输出: true
示例 2:
输入: “()[]{}” 输出: true
示例 3:
输入: “(]” 输出: false
示例 4:
输入: “([)]” 输出: false
示例 5:
输入: “{[]}” 输出: true

思路1:
1.如果字符串长度是奇数,一定不是有效括号。
2.遇到左括号就添加到栈中,遇到右括号则到栈的顶端寻找,看是否匹配,如果相同则把左括号从栈顶端移除,不相同则直接说明不是有效括号。
3.最后还要看栈中是否还有元素,如果有则说明不是有效括号。

class Solution {
    public boolean isValid(String s) {
        if(s==null||s.length()==0){
            return true;
        }
        if(s.length()%2==1){
            return false;
        }
        Map<Character,Character> map=new HashMap();
        map.put(')','(');
        map.put('}','{');
        map.put(']','[');
        Stack<Character> 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));
            }
            else{
                if(!stack.empty()&&stack.peek()!=null&&map.get(s.charAt(i)).equals(stack.peek())){
                    stack.pop();
                }
                else{
                    return false;
                }
            }
        }
        return stack.empty();
    }
}

执行用时 :3 ms, 在所有 Java 提交中击败了54.61%的用户
内存消耗 :37.1 MB, 在所有 Java 提交中击败了5.05%的用户

思路2:看题解看到一种不用数据结构的方法,用计数处理,分三类,遇到左括号就++,遇到右括号则–。

class Solution {
    public boolean isValid(String s) {
        int x = 0;
        int y = 0;
        int z = 0;
        int xy = 0;
        int xz = 0;
        int yx = 0;
        int yz = 0;
        int zx = 0;
        int zy = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                x++;
                if (y > 0) yx++;
                if (z > 0) zx++;
            } else if (s.charAt(i) == ')') {
                if (x == 1 && (xz != 0 || xy != 0)) return false;
                x--;
                if (y > 0) yx--;
                if (z > 0) zx--;
            } else if (s.charAt(i) == '[') {
                y++;
                if (x > 0) xy++;
                if (z > 0) zy++;
            } else if (s.charAt(i) == ']') {
                if (y == 1 && (yx != 0 || yz != 0)) return false;
                y--;
                if (x > 0) xy--;
                if (z > 0) zy--;
            } else if (s.charAt(i) == '{') {
                z++;
                if (x > 0) xz++;
                if (y > 0) yz++;
            } else if (s.charAt(i) == '}') {
                if (z == 1 && (zx != 0 || zy != 0)) return false;
                z--;
                if (x > 0) xz--;
                if (y > 0) yz--;
            } else {
                return false;
            }
        }
        return x == 0 && y == 0 && z == 0;
    }
}

作者:f1ne
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/bu-shi-yong-e-wai-de-shu-ju-jie-gou-shi-yong-ji-sh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
发布了20 篇原创文章 · 获赞 2 · 访问量 278

猜你喜欢

转载自blog.csdn.net/weixin_46442834/article/details/104880145
今日推荐