演算法 棧 LC20 有效的括號

2021-10-20 03:18:01 字數 1514 閱讀 3576

給定乙個只包括 『(』,』)』,』』,』[』,』]』 的字串 s ,判斷字串是否有效。

有效字串需滿足: 左括號必須用相同型別的右括號閉合。 左括號必須以正確的順序閉合。

示例 1:

輸入:s

="()"

輸出:true

示例 2:

輸入:s

="(){}"

輸出:true

示例 3:

輸入:s

="(]"

輸出:false

示例 4:

輸入:s

="([)]"

輸出:false

示例 5:

輸入:s=""

輸出:true

(

leetcode)/

/leetcode-cn

.com

/leetbook

/read

/2021

-spring-recruitment/9

ht621

/通過題目描述可以看出,最能體現括號特點的是括號巢狀的時候。在多個括號巢狀的時候最後進去的左括號要最先由右括號閉合。因為有這種最後進入的要最先出來的特點,要使用「棧」結構作為主結構。

括號應該如何推入棧中?因為正常情況下總是』(『先出現,因此將』('當作入棧的元素。

從棧中pop出來時應該如何與』)'匹配?用hashmap或function將左括號與右括號做匹配。

目前此題目的資料結構決定為 stack 和 hashmap,主要流程為

bool

isvalid

(string s)';

leftrmap[

'[']

=']'

;/*遍歷整個字串*/

for(

int index=

0; index < s.

size()

;index++

)else

stk.

pop();

}}}

有2種cases需要特別地解決:

當string全是「(」 or 「)」 多出時的處理

當string全是 「((」 時,因為沒有 「)」 所以stack裡的值刪除不了,因此在string都遍歷完畢後 stack裡有值的一定是 「(」 多出來了。

return stk.

empty()

;

當string中 「)」 多出來時,stack裡面一定是空的()

if

(charstack.

empty()

|| charstack.

top(

)!= s[i]

)

上述**的charstack.empty()解決了這個問題

20 有效的括號(棧)

判斷括號是否匹配,思路是 1 需要乙個輔助資料結構棧,將字串從第乙個字元開始逐個遍歷,如果該字元是左括號,如 則判斷該字元是否與棧頂的括號匹配。如果匹配,進入下一輪迴圈,即判斷下乙個字元。如果不匹配,直接退出函式,返回false,即無效括號。3 如果字串中每乙個字元都遍歷完了,最後看棧是否為空,如果...

20 有效的括號(括號匹配 棧)

給定乙個只包括 的字串 s 判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。示例 1 輸入 s 輸出 true 示例 2 輸入 s 輸出 true 示例 3 輸入 s 輸出 false 示例 4 輸入 s 輸出 false 示例 5 輸入 s 輸出 t...

20 有效的括號 (棧的使用)

題目描述 括號 小括號 中括號 大括號 的匹配 傳送門 解法 資料結構 中作為例子引出棧的概念。用乙個棧維護,從左到右掃瞄目標字串,如果括號匹配,即滿足三種情況 s i stack.top s i stack.top s i stack.top else if s i stack.top else ...