簡體   English   中英

平衡括號問題的優化解決方案

[英]Optimized solution for Balanced Parentheses Problem

給定一個僅包含字符'(' , ')' , '{' , '}' , '['']'的字符串,確定輸入字符串是否有效。

輸入字符串在以下情況下有效:

  1. 開括號必須用相同類型的括號閉合。
  2. 開括號必須以正確的順序閉合。
  3. 請注意,空字符串也被認為是有效的。

示例 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最后一個:

  1. 如果stack.isEmpty()返回false
  2. 如果不為空且不匹配堆棧頂部的括號,則返回false
  3. 否則,將支架彈出頂部

對於第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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM