今日刷题打卡,在leetcode里面看到了很多新奇的解题思路,真的觉得很给力。
生活的乐趣在于什么?在于每天坚持一件小事,每天学习到一小点点的知识,每天感恩生活……
题目:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
解题思路:
栈
1.首先判断输入的这个字符串是否为空,如果为空,那么一定是匹配的
2.判断输入的字符串的长度是否为偶数,这里学到了一个很巧妙的判断方法,拿这个长度与1做&运算,如果为1,则说明这个长度是奇数,如果不为一,则说明这个长度是偶数
3.设置一个栈,栈底元素初始值top为-1。
4.开始进入循环啦,从第一个元素开始,直到最后一个元素。如果输入的是=={==或者 [或者(,就进栈,栈底元素加一
5.由于之前已经判断了不为空,则如果此时栈还是空的,说明有其他元素,那也是返回false的,因为题目中说了输入只能是括号
6.如果说接下来的元素与此时的栈顶元素相匹配,== 也就是 stack[top]+1a[i] 或者stack[top]+2a[i] ==
则说明括号是相匹配的,那么此时退栈。
可以在下图中看到,( 和 )的ASCII值相差1 ,而{ 和 } 的ASCII 、[ 和 ] 的ASCII 都是相差2的
7.最后,如果是匹配的括号,栈中应该没有元素了,栈底的值又恢复成了-1,所以最后退出循环之后,判断栈底的元素是否为-1,如果是-1,就返回true , 这里也学到了一种很高级的表达方式 == return top==-1 ==
leetcode代码:
bool isvalid(char *s)
{
if(*s==0) return true;
int i,n,top=-1;
n=strlen(s); //一定要先判断s字符串的长度是否为0,如果是0,则立刻返回,因为数组的长度不能为0,所以不为0了之后,才能执行这一句。
char stack[n];
if(n&1) return false;
for(i=0;i<n;i++)
{
if(s[i]=='('||s[i]=='['||s[i]=='{')
top++;
else if(top==-1)return false;
else if(stack[top]+1==s[i]||stack[top]+2==s[i])
top--;
}
return top==-1;
}
这是昨天就应该打卡的,但是昨天只是运行出来了这道题,还没来得及写博客,今天大早上的又好好复习了一遍,现在头脑里对栈 印象非常深刻,也真正感受到了满满的收获,向leetcode里面的大佬学习!!!加油