【问题标题】:How to check if a String contains close group brackets in Java如何检查字符串是否包含Java中的闭合组括号
【发布时间】:2016-01-17 07:50:22
【问题描述】:

如何检查字符串是否正确分组。例如,以下组正确完成:

({})
[[]()]
[{()}]

接下来做错了:

{(})
([]
[])

正确的字符串不能以错误的顺序关闭组,打开一个组但无法关闭它,或者在打开之前关闭一个组。

输入字符串可以包含任何符号“()”“{}”或“[]”来创建组。如果字符串为空或以其他方式正确分组,则输出返回 True,如果分组不正确,则返回 False

谁能给我一些提示。

【问题讨论】:

标签: java string algorithm stack


【解决方案1】:

主要思想是使用Stack 来跟踪预期的下一个相应括号。 以下代码将起作用:

public boolean isValid(String s) {
    HashMap<Character, Character> closeBracketMap = new HashMap<Character, Character>();
    closeBracketMap.put(')', '(');
    closeBracketMap.put(']', '[');
    closeBracketMap.put('}', '{');
    HashSet<Character> openBracketSet = new HashSet<Character>(
        closeBracketMap.values());
    Stack<Character> stack = new Stack<Character>();

    char[] chars = s.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        char cur = chars[i];
        if (openBracketSet.contains(cur)) {
            stack.push(cur);
        } else { // close brackets
            if (stack.isEmpty()) {
                return false;
            }
            if (closeBracketMap.get(cur) != stack.peek()) {
                return false;
            }
            stack.pop();
        }
    }

    return stack.isEmpty();
}

【讨论】:

  • 看起来很复杂:0
  • @KickButtowski 对于O(n) 的最佳运行时间来说,这并不太复杂:)
  • 乞求名誉是绝对不允许的。
  • 在他发表评论之前我已经投了赞成票,所以我的赞成票是真诚的。管理员可能可以检查时间戳
【解决方案2】:

在尝试了一些东西之后,我真的不想使用堆栈。这是我的解决方案。我认为这是非常清晰和简单的:

public class Groups{
  public static boolean groupCheck(String s) {
    int len;
    do {
      len = s.length();
      s = s.replace("()", "");
      s = s.replace("{}", "");
      s = s.replace("[]", "");
    } while (len != s.length());
    return s.length() == 0;
  }
}

这意味着我们将一个一个地删除括号。

例如:String s = "[]({[]()})" (len = 10; s.length() = 10) 它将删除“[]”、“[]”、“()”。然后 s = "({})" (s.length() = 4) 它将继续删除 "{}"。然后 s = "()" (s.length() = 2),它会继续删除 "()"。然后 s = "" (s.length() = 0)。它将打破循环,因为( (len == 10) != (s.length() == 0) )。然后我们将能够检查它是否正确。 :)

【讨论】:

  • 您的解决方案的最坏情况下运行时间是O(n^2),n 字符串的长度,因为每个replace() 成本O(n)
猜你喜欢
  • 2016-02-03
  • 1970-01-01
  • 2021-09-15
  • 2020-12-09
  • 1970-01-01
  • 2013-10-03
  • 2017-03-07
  • 2010-11-14
  • 1970-01-01
相关资源
最近更新 更多