• [LeetCode]678. 有效的括号字符串、20. 有效的括号(栈)


    题目 678. 有效的括号字符串

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

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

    输入: "()"
    输出: True
    示例 2:

    输入: "(*)"
    输出: True
    示例 3:

    输入: "(*))"
    输出: True
    注意:

    字符串大小将在 [1,100] 范围内。

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

    题解

    • 两个栈,left栈装(,star栈装*。
    • 当遇到),优先pop left栈,若为空则pop*栈,若都为空则返回false。
    • 接下来要处理若两栈内有剩余的情况,两栈同时弹出配对,若left栈弹出元素索引>star栈弹出元素索引,则直接返回false。
    • 最后检查left栈为空则ok,栈可以有任意剩余,因为偶数个可配对,1个*可以作为空串。

    代码

    import java.util.Stack;
    
    class Solution {
        public boolean checkValidString(String s) {
            Stack<Integer> left = new Stack<>();
            Stack<Integer> star = new Stack<>();
            for(int i=0;i<s.length();++i){
                char c = s.charAt(i);
                if(c=='('){
                    left.push(i);
                }else if(c=='*'){
                    star.push(i);
                }else if(!left.empty()){
                    left.pop();
                }else if(!star.empty()){
                    star.pop();
                }else{
                    return false;//
                }
            }
            while(!left.empty()&&!star.empty()){
                if(left.pop()>star.pop()){
                    return false;
                }
            }
            System.out.print(star.size());
            return left.empty();
        }
    }
    

    题目

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

    有效字符串需满足:

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

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

    题解

    • 使用map存括号的对应关系。
    • 使用特殊字符入栈底,并设置对应关系,省去栈为空的特殊判断。
    • 使用栈解决。

    代码

    class Solution {
    	public static boolean isValid(String s) {
            if(s==null){
                return true;
            }
    
            Map<Character,Character> map = new HashMap<>();
            map.put('(',')');
            map.put('[',']');
            map.put('{','}');
            map.put('@','@');
            LinkedList<Character> stack = new LinkedList<>();
            stack.addLast('@');
    
            for(Character c : s.toCharArray()){
                if(map.containsKey(c)){
                    stack.addLast(c);
                }else
                    if(c!=map.get(stack.removeLast())){
                        return false;
                    }
                }
            }
            return stack.size()==1;
        }
    }
    
  • 相关阅读:
    2008秋季计算机软件基础点名册应用化学制药工程
    2008秋季计算机软件基础实验进程表应用化学制药工程
    格式化JavaScript代码
    MIME类型,MIME 参考
    2008秋季计算机软件基础0827课堂用例
    2008秋季解读大纲:计算机软件基础
    2008秋季计算机软件基础C语言精简课件
    2008秋季计算机软件基础应用化学制药工程授课日历
    几款JavaScript开发框架、开发库
    2008秋季计算机软件基础作业和实验报告注意事项
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/12913505.html
Copyright © 2020-2023  润新知