问:假设有一字符串长度无穷大,内容只有{} 六个。
结果:返回Boolean
规则: 必须成对出现,可以嵌套,但不能错位。如:
A = "{[()()[]{}]}...({[]}{}())" True
B = "{]{(){}[]}()}()}...((((){}[]" False 因:红色部分出现错位
要求:利用JAVA或JavaScript算法实现
问:假设有一字符串长度无穷大,内容只有{} 六个。
结果:返回Boolean
规则: 必须成对出现,可以嵌套,但不能错位。如:
A = "{[()()[]{}]}...({[]}{}())" True
B = "{]{(){}[]}()}()}...((((){}[]" False 因:红色部分出现错位
要求:利用JAVA或JavaScript算法实现
利用栈可以做到。一个一个字符地看,遇到左括号就压栈,遇到右括号就判断栈顶元素是否为对应的左括号,如果对应,栈顶元素出栈,继续判断下一个字符;如果不对应,则配对错误,返回false。如果到最后一个字符也可以找到栈顶元素匹配,而且这时栈为空,则返回true,否则false。《数据结构》教材好像有,严蔚敏版。
public static boolean check(String str) {
char[] chars = str.toCharArray();
int[][] a = {
{0,0},
{0,0},
{0,0}
};
for (char c : chars) {
switch (c) {
case '(':
a[0][0]++;
break;
case ')':
a[0][1]++;
if(a[0][1] > a[0][0]){
return false;
}
break;
case '{':
a[1][0]++;
break;
case '}':
a[1][1]++;
if(a[1][1] > a[1][0]){
return false;
}
break;
case '[':
a[2][0]++;
break;
case ']':
a[2][1]++;
if(a[2][1] > a[2][0]){
return false;
}
break;
default:
break;
}
}
for (int i = 0; i < a.length; i++) {
if(a[i][1] != a[i][0]){
return false;
}
}
return true;
}
public static void main(String[] args) {
String[] strs = {
"{}",
"{[()()[]{}]}({[]}{}())",
"{]{(){}[]}()}()}((((){}[]"
};
for (String string : strs) {
System.out.println(check(string) + "\t" + string);
}
}
1 回答3.4k 阅读✓ 已解决
1 回答2.8k 阅读
2.5k 阅读
1 回答543 阅读✓ 已解决
1 回答1.1k 阅读
1 回答513 阅读✓ 已解决
更新3:谢@brayden同学提醒,已经改正并简化了代码。
更新2:发现自己怎么这么热心,顺便把JavaScript版本也写了吧,放在最后。
更新1:下班回家重新整理了一下格式,原理正如楼下@DerrickChan同学所说,利用了栈的数据结构。
最近比较忙,如果需要JavaScript版本的话请告知。
来个Java的吧,提供个思路,想翻译成JavaScript也不难,就先不写了。
代码如下: