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裏面的大佬學習!!!加油

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