Java 正则表达式找到一个平衡的括号模式?
我在一次java开发人员访谈中被问到这个问题。我无法解决它,但我猜它可以用正则表达式解决。不确定在没有正则表达式的情况下是否有其他方法可以实现这一点。有人可以帮我用正则表达式来解决这个问题,或者不用正则表达式就可以解决这个问题 给定一个平衡括号字符串(它只有Java 正则表达式找到一个平衡的括号模式?,java,regex,Java,Regex,我在一次java开发人员访谈中被问到这个问题。我无法解决它,但我猜它可以用正则表达式解决。不确定在没有正则表达式的情况下是否有其他方法可以实现这一点。有人可以帮我用正则表达式来解决这个问题,或者不用正则表达式就可以解决这个问题 给定一个平衡括号字符串(它只有[或],并且已经平衡),我需要确定它是否有[*][*][*]模式(*表示0个或更多平衡括号表达式)。也就是说,检查任何[]中是否有3个或更多的[] 示例: 对于[[]][[]]]预期的答案是正确的,因为它里面有[]] 对于[[]][[[]]预
[
或]
,并且已经平衡),我需要确定它是否有[*][*][*]
模式(*
表示0个或更多平衡括号表达式)。也就是说,检查任何[]
中是否有3个或更多的[]
示例:
对于[[]][[]]]
预期的答案是正确的,因为它里面有[]]
对于[[]][[[]]
预期答案为假,因为它的连续[]]
对于
[[]][[]]]
来说,预期的答案是正确的,因为它里面有[..][][]]
。一个[]
中是否有0个或多个[]
并不重要,正则表达式不是解决此类问题的方法。由于递归,它们不能很好地处理嵌套结构
例如,这是使用堆栈(FILO)的一个完美问题。我建议你看看那些
class Node
{
private final Node parent;
private final List<Node> subNodes = new LinkedList<>();
Node(Node parent)
{
this.parent = parent;
}
static Node buildFrom(String str)
{
Node start = new Node(null);
Node current = start;
for (char ch : str.toCharArray())
{
if (ch == '[') //Create new subnode
{
Node newNode = new Node(current);
current.subNodes.add(newNode);
current = newNode;
}
else //Step back
{
current = current.parent;
}
}
return start;
}
boolean hasTripleNodes()
{
if (this.subNodes.size() >= 3) //Found triple+ nodes
{
return true;
}
else //Continue recursion
{
for (Node subNode: this.subNodes)
{
if (subNode.hasTripleNodes())
{
return true;
}
}
return false;
}
}
//DEMO
public static void main(String[] args) throws Exception {
Node nodes = Node.buildFrom("[[][[][][]]]");
System.out.println(nodes.hasTripleNodes()); //writes true
nodes = Node.buildFrom("[[]][[][]]");
System.out.println(nodes.hasTripleNodes()); //writes false
nodes = Node.buildFrom("[[[]][][[]]]");
System.out.println(nodes.hasTripleNodes()); //writes true
}
}
类节点
{
私有最终节点父节点;
私有最终列表子节点=新LinkedList();
节点(节点父节点)
{
this.parent=parent;
}
静态节点buildFrom(字符串str)
{
节点开始=新节点(空);
节点电流=启动;
for(字符ch:str.toCharArray())
{
if(ch='[')//创建新的子节点
{
Node newNode=新节点(当前);
current.subNodes.add(newNode);
当前=新节点;
}
否则,退后一步
{
current=current.parent;
}
}
返回启动;
}
布尔hasTripleNodes()
{
if(this.subNodes.size()>=3)//找到三个+节点
{
返回true;
}
else//继续递归
{
对于(节点子节点:this.subNodes)
{
if(subNode.hastTripleNodes())
{
返回true;
}
}
返回false;
}
}
//演示
公共静态void main(字符串[]args)引发异常{
Node nodes=Node.buildFrom(“[[]]]”);
System.out.println(nodes.hastTripleNodes());//写入true
nodes=Node.buildFrom(“[[][[]]]”);
System.out.println(nodes.hastTripleNodes());//写入错误
nodes=Node.buildFrom(“[[]][[[]]]”);
System.out.println(nodes.hastTripleNodes());//写入true
}
}
请在评论中详细说明进行下一次投票的原因,然后再继续…@Pshemo开括号和关括号可能是嵌套的,因此简单的contains不起作用。请参阅示例3以获得澄清。在这种情况下,您可能需要在问题描述中进一步解释。另外[*][*][*]
不清楚,因为*
在正则表达式中有非常具体的含义,而您在该示例中可能没有此含义。您的第一个示例不平衡。是否仍返回真值?@NomadMaker我搞砸了,它是平衡的,我将编辑该问题。输入始终是平衡的。我知道如何使用堆栈检查它是否平衡,但我不能我知道如何在这种特殊情况下使用它。你能给我一个类似的问题或任何关于如何开始的建议吗?在进一步阅读这个问题时,我认为你最好使用某种树结构。将每个括号(对)表示为一个节点,并为每个括号(对)创建子节点您可以从中找到。如果在最后一棵树中有任何一个节点具有3个子节点或更多子节点,那么它符合您的标准。您能告诉我如何构造这棵树吗?我无法理解如何将树的根节点连接到给定字符串的第一个和最后一个字符。@NoobScript:当我检查代码中是否有平衡括号时,我通常从左到右阅读我的代码,每个左括号加一,每个右括号减一。如果我在代码行结束时达到零,括号是平衡的。也许你可以在你的代码中做一些类似的事情?我添加了我的代码。基本上你所做的就是创建一个新的子节点并逐步进入将其放在打开支架上,或从关闭支架上跨出