簡體   English   中英

Leetcode Proble - 20. 有效括號

[英]Leetcode Proble - 20. Valid Parentheses

我正在嘗試解決這個 leetcode 問題:給定一個僅包含字符 '('、')'、'{'、'}'、'[' 和 ']' 的字符串,確定輸入字符串是否有效。

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

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

我認為我幾乎是正確的,並且長期以來一直在解決這個問題,但無法獲得正確的輸出,尤其是在輸入為“())”的情況下。

類解決方案{

public boolean isValid(String s) {

    Stack<Character> c = new Stack<>();
    int n = s.length();
    boolean bool = false;

    if (s.isEmpty() | s == null) {   // Correct
        return true;
    } 

    for (int i=0 ; i<n ; i++) {
        if (s.charAt(i) == '{') {
            c.push('{');
        } else if (s.charAt(i) == '[') {
            c.push('[');
        } else if (s.charAt(i) == '(') {
            c.push('(');

        } else if (s.charAt(i) == '}' & c.peek() == '{') {
            c.pop();
        } else if (s.charAt(i) == ']' & c.peek() == '[') {
            c.pop();
        } else if (s.charAt(i) == ')' & c.peek() == '(') {
            c.pop();
        } else {
            break;
        }
    }  
    if (c.isEmpty()) {
        return true;
    } else {
        return false;
    }
}

}

問題是您沒有將閉合括號添加到堆棧中,因此最后檢查堆棧大小會返回錯誤的結果。
您可以將缺少的方括號中的if更改為已經返回false,即

else if (s.charAt(i) == '}') {
    if(c.peek() == '{'){
        c.pop();
    }
    else{
        return false;
    }
}

其他將需要類似地進行更改。

我認為您應該在處理這些條件之前檢查堆棧的大小。

else if (s.charAt(i) == '}' & c.peek() == '{') {
        c.pop();
    } else if (s.charAt(i) == ']' & c.peek() == '[') {
        c.pop();
    } else if (s.charAt(i) == ')' & c.peek() == '(') {
        c.pop();
    } 

謝謝大家的建議。 我發現我應該在使用peek()之前檢查堆棧是否為空。

else if (s.charAt(i) == '}') {
               if (!c.isEmpty() && c.peek() == '{') {
                   c.pop();
               }
               else {
                   return false;
               }

如果有人正在尋找 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;
};

試試這個->

var isValid = function (s = "{[]}") {
  const leftSymbols = [];
  for (let i = 0; i < s.length; i++) {
    if (s[i] === "(" || s[i] === "{" || s[i] === "[") {
      leftSymbols.push(s[i]);
    } 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();
    } else {
      return false;
    }
  }
  return leftSymbols.length === 0;
};

console.log(isValid());

如果有人正在尋找 java 解決方案:

 public boolean isValid(String s) {

        Stack<Character> stack = new Stack<>();

        for(int i=0; i<s.length(); i++){
            char strChar = s.charAt(i);
            if(stack.empty()){
                stack.push(strChar);
            } else{
                char stkChar = (char) stack.peek();
                if(stkChar == '(' && strChar ==')' ){
                    stack.pop();
                } else if(stkChar == '{' && strChar=='}'){
                    stack.pop();
                } else if(stkChar == '[' && strChar == ']'){
                    stack.pop();
                } else{
                    stack.push(strChar);
                }
            }
        }
       return (stack.empty() ? "true" : "false");
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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