簡體   English   中英

嘗試檢查有效的括號/括號配對

[英]trying to check valid parentheses/bracket pairing

給定一串單獨的圓括號、方括號等,如果配對正確,我會嘗試返回 true。 (有一些類似的問題,但它們涉及更復雜的東西,如數組、字符串中的其他字符等)

這是我的代碼,當我輸入“()”時它返回false

class Solution {
    public boolean isValid(String s) {
        if (s.length() < 2) {
            return false;
        }

        for (int i = 0; i < s.length() - 1; i++) {
            char char1 = s.charAt(i);
            char char2 = s.charAt(i + 1);
            if ((int) char1 != (int) char2) {
                return false;
            }
        }
        return true;
    }
}

任何幫助或建議將不勝感激!

您可以使用堆棧來解決此問題。

假設您開始遍歷字符串的字符並且您有一個堆棧...

如果您將左括號推入堆棧,然后在相應的右括號出現時將括號從堆棧中彈出 - 您應該在檢查字符串的末尾有一個空堆棧。

如果在字符串循環結束時堆棧為空,則所有括號都成對。

如果堆棧為空並且還有更多字符要檢查(即循環未完成),則括號不配對。

如果您找到一個右括號,然后從堆棧中彈出,但沒有找到相應的左括號,這也意味着括號沒有正確配對。 對於這種情況,您可以使用一些代碼,例如:

private static boolean match(char fromStack, char next) {
    return fromStack == '[' && next == ']' || fromStack == '{' && next == '}' || fromStack == '(' && next == ')';
}

現在你只是想確保 2 個連續的字符不相同,但是 ")(" 和 "(}" 滿足該條件並且不是有效的對。另外正如@luk2302 評論的那樣,你應該每 2 迭代一次字符串中的字符。因此,不要在 for 循環中使用i++ ,而應使用i+=2

但我認為另一種方法是為此使用正則表達式:

public boolean isValid(String s) {
    // if null, or its length is zero or odd then is automatically invalid
    if (s == null || s.length() == 0 || s.length() % 2 != 0) {
        return false;
    }

    return s.matches("(\\(\\)|\\{\\}|\\[\\])+");
}

此正則表達式將匹配 "()"、"{}" 和 "[]" 1 次或多次。

以下是一些測試輸出:

() 是否有效:true
)( 有效:假
(} 有效:假
()() 有效:true
()( 有效:假
(){}[] 有效:true

暫無
暫無

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

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