20.有效的括号

题目描述:

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

示例:

示例 1:输入: "()";输出: true
示例 2:输入: "()[]{}";输出: true
示例 3:输入: "(]";输出: false
示例 4:输入: "([)]";输出: false
示例 5:输入: "{[]}";输出: true

解答:

算法

初始化栈 S。
一次处理表达式的每个括号。
如果遇到开括号,我们只需将其推到栈上即可。这意味着我们将稍后处理它,让我们简单地转到前面的 子表达式。
如果我们遇到一个闭括号,那么我们检查栈顶的元素。如果栈顶的元素是一个 相同类型的 左括号,那么我们将它从栈中弹出并继续处理。否则,这意味着表达式无效。
如果到最后我们剩下的栈中仍然有元素,那么这意味着表达式无效。

代码

public static boolean isValid(String s) {
       HashMap<Character, Character> map=new HashMap<>();
       map.put(')', '(');
       map.put('}', '{');
       map.put(']', '[');
       Stack<Character> stack=new Stack<>();
       for (int i = 0; i < s.length(); i++) {
           char c=s.charAt(i);
           //判断到是 右括号
           if (map.containsKey(c)) {
               //弹出栈顶元素
               char topElement=stack.empty()?'#':stack.pop();
               //栈顶元素与右括号对应的左括号是否相同
               if (topElement!=map.get(c)) {
                   //不相同,直接return false
                   return false;
               }
               
           }else{
               //判断到是 左括号,加入栈
               stack.push(c);
           }
       }
       //最后栈是否为空,返回结果。
       return stack.isEmpty();
           
       //不可以这样写,当没有左括号时,topElement=null,map.get(topElement)报空指针。
       //c!=map.get(topElement)
   }

注意:

在表示问题的递归结构时,栈数据结构可以派上用场。我们无法真正地从内到外处理这个问题,因为我们对整体结构一无所知。但是,栈可以帮助我们递归地处理这种情况,即从外部到内部。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有效字符串需满足:...
    闭门造折阅读 408评论 0 0
  • 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有效字符串需满足:...
    小路_阅读 285评论 0 0
  • 20. 有效的括号给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有...
    杏仁小核桃阅读 105评论 0 1
  • 20.有效的括号 给定一个只包括'(',')','{','}','[',']'的字符串,判断字符串是否有效。 有效...
    不爱去冒险的少年y阅读 405评论 0 0
  • 都说“有国才有家”,确实如此。个人的命运是与国家的命运紧紧联系在一起的。今年是恢复高考四十周年,“四十不惑”,不免...
    小小佘阅读 341评论 2 2