【问题标题】:Determine if a string that contains parentheses is balanced确定包含括号的字符串是否平衡
【发布时间】:2015-05-16 22:59:44
【问题描述】:

这是一个我试图解决一周的学校作业,我仍然没有接近真正的答案。如果有人如此友善并用一些可靠的指针指导我,那将非常感激,请注意我不想要解决方案。 例如,字符串 () 、 [()] 、 {([])} 、 ()[] 是 4 个平衡字符串。

编写递归方法:`

public static boolean isBalanced(String in)

如果 in 是平衡括号字符串并且返回 true 如果不是,则为假。

这是我一直在处理的一些代码:

    public static boolean isBalanced(String in){
        if(in.length() == 0){
            return true;
        }
        char aux = in.charAt(0);
        if(aux == '{' ||aux == '[' ||aux == '(' ){
            if(aux == '{'){
                return isBalanced(in.substring(1));
            }
            if(aux == '}'){
                return false || isBalanced(in.substring(1));
            }
            if(aux == '['){
                return isBalanced(in.substring(1));
            }
            if(aux == ']'){
                return false || isBalanced(in.substring(1));
            }if(aux == '('){
                return isBalanced(in.substring(1));
            }
            if(aux == ')'){
                return false || isBalanced(in.substring(1));
            }
        }
        return isBalanced(in.substring(1));
    }   

}

【问题讨论】:

  • 使用堆栈的解决方案非常自然且易于提出,但我无法递归思考。这就像试图用我对面的手写字什么的。
  • @CarlosSanchez 精确地使用堆栈来避免递归。使用堆栈,您只需要一个循环。
  • 问题是这里的所有答案都对我没有帮助,我已经知道如何使用堆栈来解决它,我需要使用递归来解决它,而签名不能改变,而且我不能使用任何辅助方法,因为该方法是静态的。
  • 您收到的错误消息中解释了原因。阅读它,谷歌它,如果你遇到困难,发布代码和完整的错误消息。

标签: java string recursion


【解决方案1】:

由于您不想要复制和粘贴解决方案,您应该查看这篇文章: https://stackoverflow.com/a/25854415/1057547

它是用 PHP 编写的,但解释了背后的想法,您可以轻松适应。 “验证”您的输入的页面仍然可用:http://dog-net.org/string.php,因此您可以在不做文书工作的情况下测试“巨大”的字符串。


对于您的 cmets,您需要实现递归方法。因此,对于isbalanced(String str)给定签名,我认为有两个选项可以生成递归方法:

首先,您可以 - 在第一次递归调用中 - 使用所描述的方式迭代字符串,直到您平衡 还有剩余的字符串。然后你只需要递归调用剩余字符串上的方法。

所以,对于输入字符串() [()]{([])}()[],调用栈应该变成:

isBalanced("()[()]{([])}()[]");
 isBalanced("[()]{([])}()[]");
  isBalanced("{([])}()[]");
   isBalanced("()[]");
     isBalanced("[]");

然而,这不会对像 {([])} 这样的字符串进行递归 - 因为它们可以在一次调用中处理。

第二种方法是根据“字符”输入递归。因此,您总是在 ONE 递归调用中寻找匹配的括号 第一个左括号,替换 both 并继续另一个调用。这将是一个较慢的解决方案 - 性能方面 - 但允许使用给定签名进行递归。

调用堆栈应该如下所示:

isBalanced("()[()]{([])}()[]");
 isBalanced("__[()]{([])}()[]");
  isBalanced("___()_{([])}()[]");
   isBalanced("______{([])}()[]");
    isBalanced("_______([])_()[]");
     isBalanced("________[]__()[]");
      isBalanced("____________()[]");
       isBalanced("______________[]");
        isBalanced("________________");

ps: 不管你做什么,别忘了加

isBalanced(String str){
   if (str.length() % 2 != 0) return false;
   ...
}

对于“A+”:-)

【讨论】:

  • 哈哈,是的,我想到了你的 A+ 建议,哈哈,很好。
  • 最后我决定使用两个嵌套的 for 循环来查找每个匹配的括号,如果没有找到匹配项,则返回 false,否则返回带有子字符串的方法。我不知道这是否被归类为递归,但嘿,它有一个递归调用,哈哈
猜你喜欢
  • 1970-01-01
  • 2017-03-07
  • 2018-06-23
  • 1970-01-01
  • 2013-12-28
  • 2011-11-04
  • 2021-03-06
  • 2021-09-15
  • 1970-01-01
相关资源
最近更新 更多