[英]Optimized solution for Balanced Parentheses Problem
給定一個僅包含字符'('
, ')'
, '{'
, '}'
, '['
和']'
的字符串,確定輸入字符串是否有效。
輸入字符串在以下情況下有效:
示例 1:
Input: "()[]{}"
Output: true
Example 2:
示例 2:
Input: "{[(])}"
Output: false
我對上述問題的解決方案是:
static boolean isPair(char left,char right){
return left=='{' && right=='}' || left=='(' && right==')' || left=='[' && right==']';
}
public boolean isValid(String s) {
Stack<Character> stack= new Stack<>();
for(char ch: s.toCharArray()){
if(ch=='(' || ch=='{' || ch=='['){
stack.push(ch);
}
else{
if(!stack.isEmpty() && isPair(stack.peek(),ch))
stack.pop();
else
return false;
}
}
return stack.isEmpty();
}
我在某處找到了一個更聰明的解決方案,但無法理解。 這是代碼:
public boolean isValid(String s) {
Stack<Character> stack= new Stack<>();
for(char ch: s.toCharArray()){
if(ch=='(')
stack.push(')');
else if(ch=='{')
stack.push('}');
else if(ch=='[')
stack.push(']');
else if(stack.isEmpty() || stack.pop()!=ch)
return false;
}
return stack.isEmpty();
}
請幫助我了解最后一個else-if
塊的工作原理。
您已將所有opening
支架的closing bracket
推入。 因此,當右括號出現時,它將匹配堆棧頂部的字符。 如果不匹配或堆棧變為空。 那意味着不平衡 。
else if(stack.isEmpty() || stack.pop()!=ch)
return false;
到達此處時,您將用方bracket
ch表示,但是堆棧為空,或者堆棧中的值與傳入的字符不匹配。
因此,寄生關系不平衡 。
它實際上與您自己的版本非常相似。
主要區別在於您將開放式括號推入堆棧,然后在isPair
檢查堆棧頂部的開放式括號是否與您當前正在評估的封閉式括號匹配。
該解決方案通過將預期的右括號直接推入堆棧來跳過它,但是在功能上是相同的。
if else
與您的else
完全相同, if else
最后一個:
stack.isEmpty()
返回false 對於第2種情況,解決方案會彈出堆棧,而在您的情況下您不會彈出堆棧,這有一點點差異。 但是隨着函數的返回它不會改變任何東西,並且該堆棧將不再使用。
問題的Javascript解決方案
var isValid = function (s) {
// Stack to store left symbols
const leftSymbols = [];
// Loop for each character of the string
for (let i = 0; i < s.length; i++) {
// If left symbol is encountered
if (s[i] === '(' || s[i] === '{' || s[i] === '[') {
leftSymbols.push(s[i]);
}
// If right symbol is encountered
else if (s[i] === ')' && leftSymbols.length !== 0 && leftSymbols[leftSymbols.length - 1] === '(') {
leftSymbols.pop();
} else if (s[i] === '}' && leftSymbols.length !== 0 && leftSymbols[leftSymbols.length - 1] === '{') {
leftSymbols.pop();
} else if (s[i] === ']' && leftSymbols.length !== 0 && leftSymbols[leftSymbols.length - 1] === '[') {
leftSymbols.pop();
}
// If none of the valid symbols is encountered
else {
return false;
}
}
return leftSymbols.length === 0;
};
我在這里使用JavaScript 中的 map添加我的代碼,如果您找到比它更好的方法,請添加。
` var isValid = function(s) {
let map={
")":"(",
"]":"[",
"}":"{"
}
let _stack = [];
for(let i=0;i<s.length;i++)
{
if(s[i]==="(" || s[i]==="[" || s[i]==="{")
{
_stack.push(s[i]);
}
else if(_stack[_stack.length-1]===map[s[i]])
{
_stack.pop();
}
else
return false;
}
return _stack.length?false:true;
};
`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.