Java 编写一个方法,该方法接受一串花括号,如果括号匹配,则返回true;如果括号不匹配,则返回false’;T

Java 编写一个方法,该方法接受一串花括号,如果括号匹配,则返回true;如果括号不匹配,则返回false’;T,java,Java,我在CodeHS中处理这个问题,我必须编写一个方法,该方法接受一串花括号,如果括号匹配,则返回true;如果括号不匹配,则返回false 这是到目前为止我的代码,我不知道当左花括号和右花括号的数量相同时该怎么做,但它们只是不匹配,比如(}}{{)这个例子 public boolean bracketsMatch(String brackets) { boolean result = true; int leftCtr = 0 ; //"{"; int rightCtr

我在CodeHS中处理这个问题,我必须编写一个方法,该方法接受一串花括号,如果括号匹配,则返回true;如果括号不匹配,则返回false

这是到目前为止我的代码,我不知道当左花括号和右花括号的数量相同时该怎么做,但它们只是不匹配,比如(}}{{)这个例子

public boolean bracketsMatch(String brackets)
{
    boolean result = true;
    int leftCtr = 0 ;  //"{";
    int rightCtr =0 ; // "}";
    int count = 0;

    for (int i=0; i<brackets.length(); i++)
    {
        char c = brackets.charAt(i);
        if ( c == '{')
        {
           leftCtr++;
        }
        if (c =='}')
        {
            rightCtr++;
        }
    }

    if (rightCtr==leftCtr)
    {
        result= true;
    }
    else 
    {
        return false;
    }

    return result;
}
公共布尔括号匹配(字符串括号)
{
布尔结果=真;
int leftCtr=0;/“{”;
int rightCtr=0;/“}”;
整数计数=0;

对于(int i=0;i我认为最简单的方法就是保持一个计数,对于开括号递增,对于闭括号递减。然后使用以下规则:

  • 如果计数一直低于0,则计数无效(即从未打开的结束括号)
  • 如果结尾处的计数不是0,则该计数无效(即开括号过多)
  • 考虑到这一点,您的代码将如下所示:

    public boolean bracketsMatch(String brackets)
    {
        int count = 0;
    
        for (int i=0; i< brackets.length(); i++)
        {
            char c = brackets.charAt(i);
            if ( c == '{')
            {
               count++;
            }
            else if (c =='}')
            {
                count--;
            }
    
            // Process the first rule.
            // Check if we have a negative count (i.e. close bracket without a matching opener).
            // If we have a negative then we know the string is invalid, so we can stop processing and return (false) early.
            if (count < 0)
            {
                return false;
            }
        }
    
        // Process the second rule.
        // If we got this far then we know there are no invalid close brackets, so now we need to just check to make sure we didn't have too many open brackets.
        // Return true if everything matching (i.e. 0), otherwise false.
        return count == 0; 
    }
    
    公共布尔括号匹配(字符串括号)
    {
    整数计数=0;
    对于(int i=0;i<方括号.length();i++)
    {
    字符c=括号。字符(i);
    如果(c=='{')
    {
    计数++;
    }
    else如果(c=='}')
    {
    计数--;
    }
    //处理第一条规则。
    //检查我们的计数是否为负数(即关闭支架,但没有匹配的开启器)。
    //如果我们有一个负数,那么我们知道字符串是无效的,所以我们可以停止处理并提前返回(false)。
    如果(计数<0)
    {
    返回false;
    }
    }
    //处理第二条规则。
    //如果我们走到这一步,那么我们知道没有无效的闭括号,所以现在我们需要检查一下,确保没有太多的开括号。
    //如果所有内容都匹配(即0),则返回true,否则返回false。
    返回计数==0;
    }
    
    已经Musefan给出了一个精彩的答案。下面是另一个实现。使用堆栈数据结构

    public static boolean isBracketMatch(String str) {
        Stack<Character> stack = new Stack<>();
        char c;
    
        for (int i = 0; i < str.length(); i++) {
            c = str.charAt(i);
            if (c == '{')
                stack.push('}');
            else if (c == '}') {
                if (!stack.empty() && stack.peek() == c)
                        stack.pop();
                else
                    return false;
            }
        }
        return stack.empty();
    }
    
    public静态布尔值isBracketMatch(String str){
    堆栈=新堆栈();
    字符c;
    对于(int i=0;i
    相等比较
    rightCtr==leftCtr
    应该在for-loop之外进行检查。非常感谢!@musefan-yup,刚刚做了。非常感谢。错误是左花括号和右花括号的数量相同,但它与}不匹配{{这个。@musefan yup,刚刚意识到并修复了它hahaOkay,这是有意义的,但我不明白它在类似}{{的情况下是如何工作的。{?谢谢你,因为即使它是}}{{那不是也等于零吗?因为它是-1-1+1+1吗?@CodingBat:是的,如果我们让它到达函数的末尾,它将等于零。这就是为什么我们在每个循环上检查负数。在您的示例中,第一个循环
    计数将是
    -1
    ,这意味着它无效。如果我们得到
    -1
    第恩,我们提前退出函数,所以我们永远不会检查总计数,我们基本上停止处理字符串的其余部分。好的,我现在明白了,非常感谢你,祝你有一个美好的一天!这很好,但是当程序还需要处理多种括号,例如({和[.这个答案符合OP的要求。但对任何类型的括号实施它并不困难。:)