2016-03-18 121 views
1

我正在尝试编写一个方法,该方法需要一个大括号的字符串,并且如果括号匹配则返回true,否则返回false。布尔方法,如果括号匹配返回true

这些括号匹配的例子:

{}

{} {}

{{}}

{{{} {{}}}}

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

{

} {

{{}

{{}}} {}

我无法找出正确的逻辑这后面的代码。我首先尝试了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; 
    } 
} 

会是什么这个问题的正确的逻辑,和我做我什么错误?谢谢!

+0

试试看['CodeGolf'](http://codegolf.stackexchange.com/)。我在一篇文章中看到过这样的逻辑。 –

+4

或几乎任何使用这个作为测试用例的堆栈教程。 – csmckelvey

+2

你在找什么,被称为“平衡圆括号”,可以在这里找到SO,例如在这里http://stackoverflow.com/questions/14930073/how-to-check-if-a-string-is-balanced – Jan

回答

4

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

OK

{ } 
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 
+1

@BigBoss为什么奇怪有关?当然,以零结束是唯一的正面情况。 –

4

遍历字符串,如果你得到一个开放的支架将它推到堆栈,如果你得到一个封闭的支架从堆栈中弹出一个开放的支架。如果弹出时堆栈为空,或者迭代完成时仍存在开放的括号,则括号不平衡

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

+0

这就是我们在学校里所做的。我发现堆栈对于这类问题是最好的。例如:for(int i = 0; i Habitat

+0

对不起,我还没有学会什么堆栈。这就是我的下一个项目希望成为的。 –

1

我喜欢在@Pshemoanswer和优雅的执行发生在我所描述的算法;如果结果为负数,则使用简单的for-each循环和switch,您可以在}return false之间递增count,{递减。记住,要检查count0在的东西到底喜欢

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); 
     } 
    } 
} 

这里实现通过。