【问题标题】:Boolean Method which returns true if brackets match如果括号匹配则返回 true 的布尔方法
【发布时间】:2016-07-05 20:50:56
【问题描述】:

我正在尝试编写一个方法,该方法接受一串花括号,如果括号匹配则返回 true,否则返回 false。

这些是括号匹配的示例:

{ }

{ } { }

{ { } }

{ { { } { { } } } }

这些是括号不匹配的示例:

{

} {

{ { }

{ { } } } { }

我无法弄清楚这段代码背后的正确逻辑。我首先尝试了 length() mod 2,只有当结果为 0 时,该方法才会返回 true。但很明显,有一个错误,因为即使对于像 } { 这样的字符串,它也会返回 true。我添加了一些检测 { 的代码,如果没有找到 },它会自动返回 false。但我仍然收到错误。

这是我的代码:

public boolean bracketsMatch(String brackets)
{
    if(!(brackets.length() % 2 == 0))
    {
        int i = 0;
        int j = 0;
        boolean check = false;
        while(brackets.charAt(i) == '{')
        {
            for(int o = i + 1; o < brackets.length(); o++)
            {
                if(o == '}')
                {
                    check = true;
                    break;
                }
                else
                {
                j++;
                }
            }

            if(check == false)
                return false;

            i + = j;
        }

        return true;
    }
    else
    {
        return false;
    }
}

这个问题的正确逻辑是什么,我犯了什么错误?谢谢!

【问题讨论】:

  • 试试看CodeGolf。我在一篇帖子中看到过这样的逻辑。
  • 或几乎所有使用此作为测试用例的堆栈教程。
  • 您要查找的内容称为“平衡括号”,可以在 SO 上广泛找到,例如在stackoverflow.com/questions/14930073/…

标签: java regex string char


【解决方案1】:

我喜欢@Pshemoanswer 中描述的算法,我想到了一个优雅的实现;如果使用更简单的for-each 循环和switch 结果为负,则可以在{ 上增加count 并在}return false 上减少。记住,检查count 是否在末尾是0 类似

public static boolean bracketsMatch(String brackets) {
    int count = 0;
    for (char ch : brackets.toCharArray()) {
        switch (ch) {
        case '{': count++; break;
        case '}': if (--count < 0) return false;
        }
    }
    return count == 0;
}

我还使用您的场景为上述内容创建了一个小型单元测试

public static void main(String[] args) {
    String[] good = { "{ }", "{ } { }", "{ { } }", "{ { { } { { } } } }" };
    String[] bad = { "{", "} {", "{ { }", "{ { } } } { }" };
    for (String str : good) {
        if (!bracketsMatch(str)) {
            System.out.printf("error with good: %s%n", str);
        }
    }
    for (String str : bad) {
        if (bracketsMatch(str)) {
            System.out.printf("error with bad: %s%n", str);
        }
    }
}

这里的实现通过了。

【讨论】:

    【解决方案2】:

    遍历字符串,如果你得到一个左括号将它推入堆栈,如果你得到一个右括号,则从堆栈中弹出一个左括号。如果弹出时堆栈为空,或者当您完成迭代时,堆栈上仍然有开括号,那么您的括号不平衡

    如果您正在检查多种类型的平衡性,即 () [] {} 等,那么当您弹出时,您需要确保弹出的左括号与您刚刚遇到的右括号的类型相同,否则括号不平衡。

    【讨论】:

    • 我们在学校就是这样做的。我发现堆栈最适合此类问题。例如: for (int i = 0; i
    • 对不起,我还没有了解堆栈是什么。这就是我的下一个项目的希望。
    【解决方案3】:

    使用计数器。找到{ 时增加它,找到} 时减少它。如果在某些时候计数器为负数,则字符串无效。如果在处理完所有字符后计数器为 0,则返回 true。

    好的

    { }
    1 0
    
    { } { }
    1 0 1 0
    
    { { } }
    1 2 1 0
    
    { { { } { { } } } }
    1 2 3 2 3 4 3 2 1 0
    

    不行

    {
    1
    
    }  {
    -1   <- no point checking farther
    
    { { }
    1 2 1 
    
    { { } }  } { }
    1 2 1 0 -1  <- no point checking farther
    

    【讨论】:

    • @BigBoss 为什么奇怪相关?肯定以零结束是唯一的积极案例。
    猜你喜欢
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2011-06-19
    • 2017-09-16
    相关资源
    最近更新 更多