Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中检查字符串是否包含闭合组括号_Java_String_Algorithm_Stack - Fatal编程技术网

如何在Java中检查字符串是否包含闭合组括号

如何在Java中检查字符串是否包含闭合组括号,java,string,algorithm,stack,Java,String,Algorithm,Stack,如何检查字符串的分组是否正确。例如,正确完成以下组: ({}) [[]()] [{()}] {(}) ([] []) 下一步操作不正确: ({}) [[]()] [{()}] {(}) ([] []) 正确的字符串不能以错误的顺序关闭组、打开组但无法关闭组或在打开组之前关闭组 可以包含用于创建组的任何符号“()”{}”或“[]”的输入字符串。如果字符串为空或分组正确,则输出返回True;如果分组错误,则输出返回False 请大家给我一些提示。主要思想是使用堆栈来跟踪下一个对应的括号。 以

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

({})
[[]()]
[{()}]
{(})
([]
[])
下一步操作不正确:

({})
[[]()]
[{()}]
{(})
([]
[])
正确的字符串不能以错误的顺序关闭组、打开组但无法关闭组或在打开组之前关闭组

可以包含用于创建组的任何符号“()”{}”或“[]”的输入字符串。如果字符串为空或分组正确,则输出返回
True
;如果分组错误,则输出返回
False


请大家给我一些提示。

主要思想是使用
堆栈来跟踪下一个对应的括号。
以下代码将起作用:

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();
}
公共布尔值有效(字符串s){
HashMap closeBracketMap=新HashMap();
closeBracketMap.put('),'(');
closeBracketMap.put(']','[');
closeBracketMap.put('}','{');
HashSet openBracketSet=新HashSet(
closeBracketMap.values());
堆栈=新堆栈();
char[]chars=s.toCharArray();
for(int i=0;i
在尝试了一些方法之后,我真的不想使用stack。这是我的解决方案。我认为这非常清楚和简单:

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

使用Java中的stack(deque)。可能的重复请将相应的答案标记为解决方案如果它解决了您问题中的问题,这样未来的读者就可以轻松地立即找到解决方案。看起来非常复杂:0@KickButtowski对于
O的最佳运行时来说,它并不太复杂(n) 
:)乞讨名誉是完全不允许的。在他发表评论之前,我已经投了赞成票,所以我的赞成票是真诚的。管理员可能会检查时间。您的解决方案最糟糕的运行时间是
O(n^2)
,n字符串的长度,因为每个
replace()
都要花费
O(n)