如何检查String中是否包含紧密组括号

时间:2015-10-19 03:54:27

标签: java string algorithm stack

如何检查字符串以进行正确的分组。例如,以下组正确完成:

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

接下来做错了:

{(})
([]
[])

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

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

愿任何人给我一些暗示。

2 个答案:

答案 0 :(得分:8)

主要想法是使用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();
}

答案 1 :(得分:0)

我真的不想在尝试使用堆栈后使用堆栈。这是我的解决方案。我认为这非常简单明了:

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))。然后我们将能够检查它是否属实。 :)