java - 如何检查 String 是否包含 Java 中的右组括号

标签 java string algorithm stack

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

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

接下来做错了:

{(})
([]
[])

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

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

谁能给我一些提示。

最佳答案

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

关于java - 如何检查 String 是否包含 Java 中的右组括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33206395/

相关文章:

java - 使用 HashSet 从排序数组中删除重复项

Java JOGL 纹理对象未翻译

regex - 替换两个字符串之间所有出现的字符

python打印转义反斜杠

algorithm - 如何以更接近匹配的方式获得排序列表?

java - 给定一个数字数组,使用 Map Reduce 返回所有其他数字的乘积数组

java - 为什么我使用 Apache Commons FileUpload 得到 "FileUploadException: Stream ended unexpectedly"?

java - 请放心 : POST request example (help)

sql - 在没有 JSON_VALUE 的 SQL 中获取 json 值

javascript - 使用 ng-repeat、ng-model 和复选框获取数组中的位置