当前位置: 首页 > 知识库问答 >
问题:

递归检查给定字符串是否为平衡括号字符串

庞旺
2023-03-14

作为一名java(和编程)新手,我在完成分配给我们的任务时遇到了麻烦。作业分为三部分,检查给定的字符串是否有平衡括号。

“规则”如下:

  • "abcdefksdhgs"-是平衡的
  • "[{aaa

赋值的第一部分是编写一个方法,该方法将获取包含字符串的char数组,并将找到包含括号的第一个索引(=数组单元格),如下所示之一:

} , { , ] , [ , ( , ) , > , <  

这当然很容易做到:

/**
 * bracketIndex - 1st Method:
 * this method will get a single string (read from the text file),
 * and will find the first index char that is any bracket of the following: },{,],[,(,),>,<
 * @param str1 - the given string.
 * @return index - the first index that contains character that is one of the brackets listed above.
 */
public static int bracketIndex(String str1){
        int index = -1; // default value: didn't find any bracket in the string.
        int i = 0;
        for( i = 0; i < str1.length(); i++ ){
                if(str1.charAt(i) == '}' || str1.charAt(i) == '{' || str1.charAt(i) == ']' || str1.charAt(i) == '[' || str1.charAt(i) == '(' || str1.charAt(i) == ')' || str1.charAt(i) == '>' || str1.charAt(i) == '<'){
                        return index = i;
                }//if
        }//for
        return index;
}//end of bracketIndex

第二部分是编写一个方法,该方法将获得两个字符,并且仅当第二个字符是第一个字符的适当右括号时才返回true(例如:1st=)

/**
 * checkBracket - 2nd Method:
 *
 * @param firstChar, secondChar - two chars.
 * @return True - if the the two chars are brackets, in which the second char is the closing bracket of the first char
 */
public static boolean checkBracket(char firstChar, char secondChar){
        if (    (firstChar == '(') && (secondChar == ')') ||
                        (firstChar == '[') && (secondChar == ']') ||
                        (firstChar == '{') && (secondChar == '}') ||
                        (firstChar == '<') && (secondChar == '>')   ){
                return true;
        }//if
        return false;
}//end of checkBracket

第三部分是写一个递归方法,它将得到一个字符串,当且仅当该字符串是平衡的括号字符串时,返回“真”。当然,我们需要使用1档

提示:使用aid方法,该方法将获得2个字符串

在这一部分,我被困住了。我提出了几个停止案例:

  1. 如果给定字符串中根本没有括号-返回true
  2. 如果给定的字符串为空,则返回true(此选项包含在第1个方法中)
  3. 如果找到打开的括号和匹配的关闭括号-返回true

否则,返回false。在编写代码的过程中,我目前陷入了困境,不知道如何从代码中第26行的递归调用继续此方法:

/**
 * checkBalance - 3rd Method:
 * will check if a given string is a balanced string.
 * @param str1 - the given string to check.
 * @return true - if the given string is balanced, false - if the given string isn't balanced.
 */
public static boolean checkBalance(String str1){
        boolean ans;
        int a = bracketIndex(str1);
        if ( a == -1 ){
                return ans = true;
        }//if
        if( str1.charAt(a) == '{' ||
                        str1.charAt(a) == '[' ||
                        str1.charAt(a) == '<' ||
                        str1.charAt(a) == '('   ){
                int b = bracketIndex(str1.substring(a))+1 ;
                if( b != 0 ){
                        if( checkBracket ( str1.charAt(a), str1.charAt(b) ) == true ){
                                return ans = true;
                        }//if
                        if( str1.charAt(b) == '{' ||
                                        str1.charAt(b) == '[' ||
                                        str1.charAt(b) == '<' ||
                                        str1.charAt(b) == '('   ){
                                checkBalance(str1.substring(b-1));
                        }//if
                        else{
                                return ans = false;
                        }//else
                }//if
        }//if
        return ans = false;
}//end of checkBalance

我不知道如何继续,如果第26行的递归代码将返回true。

我将很高兴从这里的专家那里得到一些指导,告诉我该往哪个方向走,否则我从一开始就做错了。


共有3个答案

法弘壮
2023-03-14
匿名用户

你的括号索引是一个很好的起点,但是,我认为你需要更多的组件。

首先,您需要能够只检查字符串的一小部分。所以你签名应该是< code>checkBalanced(String str,int start,int end)。当您最初开始一个字符串时,它将是< code > check balanced(String str){ return check balanced(str,0,str . length()-1;}因为它开始的“小”部分恰好是整个字符串。

然后我会从字符串的前面开始,找到第一个括号。然后我从那里开始工作,直到我碰到第一个括号的右括号。如果我在字符串中没有找到任何大括号,我返回true。如果我遍历了字符串,在找到左大括号之前找到了右大括号,我返回false。这些是你的基本情况,并且在任何递归算法中都是必需的。

如果我如预期的那样找到了大括号,我将对两者之间的子字符串运行checkBalanced,并对紧接在右大括号之后到字符串末尾的子字符串运行checkBalanced。(注意“字符串结尾”不是string.length(),而是传入的结尾索引。当我们在这个方法中时,我们只关心传递给这个方法的范围。)这些是你实际的递归,在这种情况下你有两个。

锺离良哲
2023-03-14

这个想法是保留一个打开的括号列表,如果你找到一个关闭的括号,检查它是否关闭了最后一个打开的括号:

  • 如果这些括号匹配,则从openedBrackets列表中删除最后打开的括号,并继续递归检查字符串的其余部分
  • 否则,您会发现一个括号关闭了一次打开的nerver,因此它不平衡。

当字符串最终为空时,如果括号列表也为空(因此所有括号都已关闭)返回true,否则false

算法(Java语言):

public static boolean isBalanced(final String str1, final LinkedList<Character> openedBrackets, final Map<Character, Character> closeToOpen) {
    if ((str1 == null) || str1.isEmpty()) {
        return openedBrackets.isEmpty();
    } else if (closeToOpen.containsValue(str1.charAt(0))) {
        openedBrackets.add(str1.charAt(0));
        return isBalanced(str1.substring(1), openedBrackets, closeToOpen);
    } else if (closeToOpen.containsKey(str1.charAt(0))) {
        if (openedBrackets.getLast() == closeToOpen.get(str1.charAt(0))) {
            openedBrackets.removeLast();
            return isBalanced(str1.substring(1), openedBrackets, closeToOpen);
        } else {
            return false;
        }
    } else {
        return isBalanced(str1.substring(1), openedBrackets, closeToOpen);
    }
}

测试:

public static void main(final String[] args) {
    final Map<Character, Character> closeToOpen = new HashMap<Character, Character>();
    closeToOpen.put('}', '{');
    closeToOpen.put(']', '[');
    closeToOpen.put(')', '(');
    closeToOpen.put('>', '<');

    final String[] testSet = new String[] { "abcdefksdhgs", "[{aaa<bb>dd}]<232>", "[ff{<gg}]<ttt>", "{<}>" };
    for (final String test : testSet) {
        System.out.println(test + "  ->  " + isBalanced(test, new LinkedList<Character>(), closeToOpen));
    }
}

输出:

abcdefksdhgs  ->  true
[{aaa<bb>dd}]<232>  ->  true
[ff{<gg}]<ttt>  ->  false
{<}>  ->  false

请注意,我导入了以下类:

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
郑俊美
2023-03-14

您可以使用堆栈来跟踪预期的下一个相应括号。以下代码将起作用:

public boolean isValid(String s) {
    HashMap<Character, Character> closeBracketMap = new HashMap<Character, Character>();
    closeBracketMap.put(')', '(');
    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 if (closeBracketMap.keySet().contains(cur)) { // close brackets
            if (stack.isEmpty()) {
                return false;
            }
            if (closeBracketMap.get(cur) != stack.peek()) {
                return false;
            }
            stack.pop();
        }
    }
    return stack.isEmpty();
}
 类似资料:
  • 我得写Python补充函数: 对于递归检查输入字符串是否具有平衡括号的函数: 我不能使用堆栈。当输入字符串为空时,当括号开始和结束时,我必须包含一个选项(以及一个小提示,不是每个结束括号我们都应该做出相同的反应),并包含对括号以外字符的反应。补充函数必须返回未处理的文本和以前的结果。 我有代码,遗憾的是它并不适用于我找到的每个例子: 在测试中,错误的答案在 和 我试图从 pythontutor.c

  • 问题内容: 我想测试输入的String是否平衡。如果有匹配的左,右括号,括号或花括号,则将是平衡的。 我在选择做什么时遇到问题。我是否应该将每个左括号或右括号,方括号或大括号放在堆栈中,然后弹出它们?如果我将它们弹出,那对我有什么帮助? 问题答案: 1)对于每个开口支架:将其推入堆栈。 2)对于每个右括号:从堆栈中弹出并检查括号的类型是否匹配。如果不退货; 即 String中的当前符号是,如果从堆

  • 我想测试输入字符串是否平衡。如果有一个匹配的开始和结束括号、括号或大括号,这将是平衡的。 我在选择做什么时遇到了问题。我是否应该将每个开始或结束的括号、括号或大括号放在一个堆栈中,然后将它们弹出?如果我把它们拿出来,这对我有什么帮助?

  • 问题内容: 假设我有一个包含一些字母和标点符号的String数组 在字母[3]中,我们带有“。” 如何检查字符串是否为标点符号?我们知道有许多可能的标点符号(,。?!等) 到目前为止,我的进度: 问题答案: 您是否还需要检查更多标点符号? 如果是这样,您可以执行此操作。

  • 问题内容: 我有一个isNotEmpty函数,如果字符串不为空,则返回true;如果字符串为空,则返回false。我发现如果我通过它传递一个空字符串,它将无法正常工作。 使用isNotEmpty验证字符串: 如果该字符串为空,则其他字符串将不会执行,我不明白为什么,请有人对此有所帮助。 问题答案: 实际上是简单的问题。更改: 至 可以说,您可能还想将其更改为: 因为如果您传递的是数字0以及其他一些

  • 问题内容: 我想编写一个简单的类来处理字符串(可能是很长的字符串,最多可以包含100万个字符)。字符串基本上由两个可以相互混合的字符“ a”和“ b”组成。如果a的个数等于b的个数,则应用会说可以,否则为NOK。我想知道如何最有效地做到这一点。我考虑过使用正则表达式拆分String,然后计算a和b的出现次数,但也许有人知道更好的方法。对于regex来说还比较陌生,所以请让我知道是否有任何错误。这是