演算法 有效的括號

2022-10-09 04:18:08 字數 1634 閱讀 9234

有效的括號

核心思路:最左邊的右括號的,必定與不超過右括號的最右邊的左括號匹配(棧頂元素)

解法一:最左邊的右括號的前乙個括號必定是相匹配的右括號

思路: 1.如果長度為奇數返回false,如果左棧為空的時,出現右括號直接返回false

2.從左到右遍歷每個括號,如果是左括號就入棧,直到遇到右括號(第乙個右括號匹配的左括號是右括號前的最後乙個左括號)

3.遇到右括號,棧頂的左括號必定相匹配,匹配的話就左棧出棧。否則返回false

4.指標右移,直到串尾。

1

class

solution

' || *beg == '

)')) return

false;//

左括號空的情況下,出現右括號返回false

10if (*beg == '

[' || *beg == '

16char c = *beg;//

讀取=非左括號,就需要確定棧頂的元素是否匹配

17char t =st.top();

18switch

(c)19

28else

2934

case'}

':35if (t == '

42else

4347

case')

':48if (t == '('

)4955else

5660

61default:62

break;63

}64}65

if (st.empty()) return

true;66

else

return

false;67

68 }

解法2: 1.如果是奇數長度,返回false

2.遍歷字串,碰到右括號(如果左棧為空,左棧不匹配返回false),左棧棧頂元素直接出棧。

3。碰到左括號,入棧。

亮點:使用了雜湊表來進行左右括號的對應。

使用右括號來當主鍵,通過判斷表中的符號的count來判斷是左括號,還是右括號(因為右括號是主鍵,左括號的count==0)

1

bool isvalidlc(string

s) 67//

建立無序表

8 unordered_map pairs =,

10 ,

11

', '

12};

13 stackstk;

14//

一次遍歷每乙個char

15//

查詢到的第乙個右括號,其左括號必在棧頂,最左邊的右括號,前乙個括號必為相匹配的右括號

16for (char

ch : s)

24stk.pop();25}

26//

如果ch是左括號直接入棧

27else30}

31return

stk.empty();

32 }

語法記錄:

指向string第乙個字元的位置:char* beg = &s[0]

跳過迴圈:continue

演算法 有效的括號

偽 1.得到字串.2.建立乙個linkedlist 用來模擬stack 2.非空判斷,空返回true 3.遍歷字串 如果第一次碰到三個括號 第乙個括號是右括號必定是錯誤的 如果碰到左括號,給linkedlist中新增對應的右括號,碰到右括號,判斷linkedlist末尾的右括號是否與其匹配,匹配則刪...

演算法 有效的括號

給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。1 輸入 輸出 false 2 輸入 輸出 true 在最開始看到該題時是想將輸入的字串都先放入棧中,然後對棧進行操作 但是這種方法有點複雜。後邊實在...

演算法 有效的括號

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