在网上发现了一些有趣的解决问题的问题。
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");
}
答案 0 :(得分:5)
您的方法过于复杂。您只需要三个计数器 - countRound
,countSquare
和countCurly
。将所有三个初始化为零,然后逐个字符地遍历字符串。如果你看到一个开括号,增加它的计数器;如果它是一个右括号,则递减其相应的计数器。一旦循环结束,所有三个计数器必须为零;否则括号的数量不匹配。
注意:这不检查括号是否平衡,因为您的示例不需要它(即"[(])"
生成"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;
}
}