有效的括號
核心思路:最左邊的右括號的,必定與不超過右括號的最右邊的左括號匹配(棧頂元素)
解法一:最左邊的右括號的前乙個括號必定是相匹配的右括號
思路: 1.如果長度為奇數返回false,如果左棧為空的時,出現右括號直接返回false
2.從左到右遍歷每個括號,如果是左括號就入棧,直到遇到右括號(第乙個右括號匹配的左括號是右括號前的最後乙個左括號)
3.遇到右括號,棧頂的左括號必定相匹配,匹配的話就左棧出棧。否則返回false
4.指標右移,直到串尾。
1class
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)
1bool 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 輸入 輸...