检查给定的String是否具有相同匹配的括号

时间:2016-03-17 09:42:59

标签: java

在网上发现了一些有趣的解决问题的问题。

You are to check the given String str if they contains matching parenthesis.
  

示例输入: [],[(]),{[]},{[}],{[}},{]}

     

示例输出: EQUAL,EQUAL,EQUAL,EQUAL,NOT EQUAL,NOT EQUAL

我已经设法使用基础知识完成了此功能的要求,只是想知道是否有更好的方法吗?

String str = "{[(])}(){}";
    int pairs = 0;
    boolean unableToFind = false;
    ArrayList<Character> anChar = new ArrayList<Character>();

    for (int i = 0; i < str.length(); i++) {
        anChar.add(str.charAt(i));
    }

    if (str.length() % 2 == 0) { 
        while (pairs != str.length() / 2) {
            for (int i = 1; i < anChar.size(); i++) {
                char a = (char) anChar.get(0);
                char b = (char) anChar.get(i);
                if (a == '{' && b == '}' || a == '[' && b == ']' || a == '(' && b == ')') {
                    anChar.remove(i);
                    anChar.remove(0);
                    pairs++;
                    break;
                } else {
                    if (i == anChar.size() - 1) { // reached end of array
                        unableToFind = true;
                        break;
                    }
                }
            }
            if (unableToFind)
                break;
        }

        if (pairs == str.length() / 2) {
            System.out.println("Log#01: The String have balanced parenthesis");
        } else {
            System.out.println("Log#02: The String do not have balanced parenthesis. (" + pairs + "/" + str.length() / 2 + " pairs found)");
        }
    } else {
        System.out.println("Log#03: The String do not have even numbers of parenthesis");
    }

3 个答案:

答案 0 :(得分:5)

您的方法过于复杂。您只需要三个计数器 - countRoundcountSquarecountCurly。将所有三个初始化为零,然后逐个字符地遍历字符串。如果你看到一个开括号,增加它的计数器;如果它是一个右括号,则递减其相应的计数器。一旦循环结束,所有三个计数器必须为零;否则括号的数量不匹配。

注意:检查括号是否平衡,因为您的示例不需要它(即"[(])"生成"EQUAL"即使通过输入是不平衡的。)

答案 1 :(得分:3)

只需使用char c = input.charAt(i); if(c == ')' || c == '}' || c == ']') { if(stack.isEmpty()) return false; Character stackTop = stack.pop(); if( (c == ')' && stackTop != '(') || (c == '}' && stackTop != '{') || (c == ']' && stackTop != '[') ) return false; } else stack.push(c); 即可。您需要遍历String中的每个字符,当您找到右括号时,查看堆栈顶部是否具有适当的左括号。逻辑看起来像这样:

Netty 4.0.43

对于像“{{}”这样的情况,堆栈将包含末尾的第一个“{”。所以检查以确保它是否为空。

不确定您提供的示例。如果对于“[{(]})”,结果为“EQUAL”,当字符串显然不平衡时,dasblinkenlight具有answer:)

答案 2 :(得分:1)

不像以前的答案那样优雅但是有效。 检查括号对中的计数是否匹配。

public class EqualClass {

    public static void main(String[] args) {
        String input = "[ ] , [ ( ] ) , { [ ] } , { [ } ] , { [ } ) , { ] }";
        String[] tokens = input.split(",");

        char[] bracketTypes = { '[', '{', '(' };
        char[] oppositeBracketType = { ']', '}', ')' };

        for (String token : tokens) {
            boolean equal = true;
            char[] characters = token.toCharArray();
            for (int indx = 0; indx < bracketTypes.length; indx++) {
                if (EqualClass.Test(characters, bracketTypes[indx]) != EqualClass
                                .Test(characters, oppositeBracketType[indx])) {
                    equal = false;
                    break;
                }

            }

            if (!equal) {
                System.out.println(token + " Not Equal");
            } else {
                System.out.println(token + " Equal");
            }

        }
    }

    public static int Test(char[] tokenOfCharacter, char bracketType) {
        int count = 0;
        for (char character : tokenOfCharacter) {
            if (character == bracketType) {
                count += 1;
            }
        }
        return count;
    }

}