leetcode-力扣-20. 有效的括号

Posted 银背欧尼酱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode-力扣-20. 有效的括号相关的知识,希望对你有一定的参考价值。

在这里插入图片描述

判断括号是否有效
题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:

输入:s = “()”
输出:true

示例 2:

输入:s = “()[]{}”
输出:true

示例 3:

输入:s = “(]”
输出:false

示例 4:

输入:s = “([)]”
输出:false

示例 5:

输入:s = “{[]}”
输出:true

思路

我们可以选择用栈的方式来解题,具体步骤
1.依次遍历输入的符号,如果符号为左括号’([{’,则输入到栈中去
2.如果符号为右括号’)]}’,则和栈顶元素相比较,如果能配对成’() [] {}'则去除栈顶元素,继续遍历
如果不能配对返回false
3.遍历结束后如果栈中还有元素说明为假。如果未输入任何符号也为假。
但是这里我们并没用栈的方式是因为C语言中不存在栈的数据类型,我们需要自己创造栈的类型
并且实现栈的增删查改等功能,难度系数暴增!
所以这里我们采用数组的方式来代替,思想都是一样的,
只是让此时输入的元素和数组中最后一个元素做对比,如果能配对继续遍历,否则为假
其余步骤一模一样

核心代码部分

char pairs(char a)
{
   if(a=='}')
       return '{';
   else if(a==')')
       return '(';
   else if(a==']')
       return '[';
   else
       return 0;
}
bool isValid(char * s){
   
   //判断元素个数,元素个数为0或为奇数一定为假
   int size=strlen(s);
   if(size==0||size%2==1)
       return false;
   
   //定义数组存放元素,****************请注意这个地方***************
   //****leetcode官方给的是数组大小为(size+1),比输入的字符数多一个****
   //****但实际上数组大小为输入字符的一半就可以了,因为只有“左括号”才输入到数组中****
   //****如果左括号的输出超过字符个数的一半,说明右括号的数量一定小于左括号,必然无法配对****
   //****所以这里我们定义为 char array[(size/2)+1];****
   char array[(size/2)+1];// char array[size+1] 官方的写法
   int pop=0;
   for(int i=0;i<size;i++)
   {
      // 左括号输入到数组中
       if(!pairs(s[i]))
       {
           array[pop++]=s[i];
       }
       //右括号对比
       else if((pairs(s[i])=='{')||
       (pairs(s[i])=='[')||
       (pairs(s[i])=='('))
       {
           if(pop==0)
               return false;
           else if(array[pop-1]==pairs(s[i]))
           {
               pop--;
           }
           else
               return false;
       }
   }
   //遍历对比结束后一个元素不剩说明成功配对
   return pop==0;
}

优化先后的对比在这里插入图片描述

总结

细节决定成败,希望在做题的过程中我们都能勤加思考,也许一点小小的改动就能大大的优化程序!

以上是关于leetcode-力扣-20. 有效的括号的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-力扣-20. 有效的括号

力扣20-有效的括号&力扣22-括号生成

LeetCode #20 有效括号

LeetCode20_Valid Parentheses有效的括号

20. 有效的括号

20. 有效的括号