LeetCode刷题03:有效的括号(括号匹配)

今日刷题打卡,在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里面的大佬学习!!!加油

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章