我想检查一个字符串是否与递归平衡。我在论坛上找到了一些与这个问题相关的帖子,有些答案是用我不懂的编程语言写的。我可以在堆栈溢出上阅读类似的问题后用堆栈做,我如何递归地做?
private static boolean isBalanced(String s, char match)
{
char c;
if(s.isEmpty())
return true;
for(int i = 0; i < s.length(); i++)
{
c = s.charAt(i);
if(c == '{')
return isBalanced(s.substring(i+1), '}');
else if(c == '[')
return isBalanced(s.substring(i+1), ']');
else if(c == '(')
return isBalanced(s.substring(i+1), ')');
// Closing matches.
else if(c == match)
return true;
}
return
}
平衡是{}()[]及其任意组合,如[()]
我不希望任何人为我编码,事实上,我希望知道如何做它。这就是为什么我不理解其他语言的答案,因为他们太具体的语言,而不是一个算法。
5条答案
按热度按时间wsxa1bj11#
这是一个算法,我刚刚试过了,它很有效。想法是在每个开括号上你都期望有一个相同类型的结束括号。上面的函数需要像
isBalanced("([2+3])", 0, new Stack<Character>())
这样调用。期望的字符使用stack
来维护。下面是非堆栈版本的代码:Call是这样的
isBalanced2("{[]}[()]", 0, '\0') < 0 ? false : true
。xytpbqjk2#
递归的原理和使用堆栈的原理是一样的,调用堆栈是LIFO结构,你可以根据它进行调用。
举一个简单的平衡字符串:
重要的事先说-我们先定好条件。
bal
开始,我会在bal.substring(1)
上递归。我不会使用循环,因为你仍然在遍历整个String,我宁愿消耗它,以减少我必须回溯的字符数量。
enyaitl33#
直接循环是快速解决方案:
算法复杂度为O(N),不含子串等。
vecaoik14#
让我们正式地处理这个问题,以增加我们不需要大量调试就能得到一个工作解决方案的可能性。
什么是平衡字符串?下面是一个简单的语法:
请注意,此语法生成类似
(hello)[[good]{bye}]
的字符串,它们具有多个“顶级”组。现在让我们把它变成一个递归下降解析器,每个非终结符(
BalancedString
、Sequence
和Fragment
)都变成一个函数,我们从解析'BalancedString'非终结符的函数开始:注意,这个函数期望
parseSequence
返回它停止解析的偏移量,接下来我们写parseSequence
,我们将使用一个循环而不是直接递归。注意,
parseSequence
期望parseFragment
返回它停止解析的偏移量,如果失败,它应该返回传递给它的偏移量。现在我们将编写parseFragment
。我们将从它的三个类似结果中提取公共代码到一个helper函数中。helper函数期望接收到打开器的偏移量,以便在失败时返回该偏移量;如果成功,则返回刚刚经过关闭器的偏移量。
olhwl3o25#
http://www.geekpandit.com/2016/07/25/simple-balanced-parenthesis-problem-stack-implementation/ .