給定乙個只包括'('
,')'
,''
,'['
,']'
的字串,判斷字串是否有效。
有效字串需滿足:
左括號必須用相同型別的右括號閉合。
左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。
示例 1:
輸入: "()"
輸出: true
示例 2:
輸入: "(){}"
輸出: true
示例 3:
輸入: "(]"
輸出: false
示例 4:
輸入: "([)]"
輸出: false
示例 5:
輸入: ""
輸出: true
**思路**
想象一下,你正在為你的大學課設編寫乙個小型編譯器,編譯器的任務之一(或稱子任務)將檢測括號是否匹配。
我們本文中看到的演算法可用於處理編譯器正在編譯的程式中的所有括號,並檢查是否所有括號都已配對。這將檢查給定的括號字串是否有效,是乙個重要的程式設計問題。
我們這個問題中將要處理的表示式可以包含以下三種不同型別的括號:
在檢視如何檢查由這些括號組成的給定表示式是否有效之前,讓我們看一下該問題的簡化版本,在簡化後的問題中,只含一種型別的括號。這麼一來,我們將會遇到的表示式是
(((((()))))) -- valid
()()()() -- valid
(((((((() -- invalid
((()(()))) -- valid
上我們試著用乙個簡單的演算法來解決這一問題。
我們從表示式的左側開始,每次只處理乙個括號。
假設我們遇到乙個開括號(即(
),表示式是否無效取決於在該表示式的其餘部分的某處是否有相匹配的閉括號(即)
)。此時,我們只是增加計數器的值保持跟蹤現在為止開括號的數目。left += 1
如果我們遇到乙個閉括號,這可能意味著這樣兩種情況:
此閉括號沒有與與之對應的開括號,在這種情況下,我們的表示式無效。當left == 0
,也就是沒有未配對的左括號可用時就是這種情況。
我們有一些未配對的開括號可以與該閉括號配對。當left > 0
,也就是有未配對的左括號可用時就是這種情況。
如果我們在left == 0
時遇到乙個閉括號(例如)
),那麼當前的表示式無效。否則,我們會減少left
的值,也就是減少了可用的未配對的左括號的數量。
繼續處理字串,直到處理完所有括號。
如果最後我們仍然有未配對的左括號,這意味著表示式無效。
如果我們只是嘗試對原始問題採用相同的辦法,這是根本就行不通的。基於簡單計數器的方法能夠在上面完美執行是因為所有括號都具有相同的型別。因此,當我們遇到乙個閉括號時,我們只需要假設有乙個對應匹配的開括號是可用的,即假設left > 0
。
但是,在我們的問題中,如果我們遇到]
,我們真的不知道是否有相應的[
可用。你可能會問:
為什麼不為不同型別的括號分別維護乙個單獨的計數器?這可能不起作用,因為括號的相對位置在這裡也很重要。例如:
[
public boolean isvalid(string s)
} else
}// if the stack still contains elements, then it is an invalid expression.
return stack.isempty();
}}
複雜度分析
啊這個**看完感覺設計的真的很巧妙啊!難道是因為自己太小白了- -,開頭把「()」,「{}」,「」,鍵值對存入,而且把左括號當做key值,右括號作為value值,方便了下面獲得棧頂元素和當前字元的value比較,這是乙個反轉的地方,我覺得特別好
20 有效括號
1.題目描述 給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。2.示例 輸入 輸出 true輸入 輸出 false3.思路 可以採用棧來解決,第一步 判斷棧是否空,為空則進乙個括號,若不為空,則判斷當前括號和棧頂元素是否匹配,不...
20 有效的括號
給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true示例 2 輸入 輸出 true示例 3 輸入 輸出 false示例 4 輸入 輸出 false示例 5 輸入 輸出 tr...
20 有效的括號
給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true示例 2 輸入 輸出 true示例 3 輸入 輸出 false示例 4 輸入 輸出 false示例 5 輸入 輸出 tr...