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. 有效的括号的主要内容,如果未能解决你的问题,请参考以下文章