输入一个仅包含括号的字符串判断括号是否有效
例如:
- 有效:"{}" “[]” “()” “{[()]}”…
- 无效: “(]” “{[](}” “{{[()]}”
第一种方法(暴力匹配字符串)
/**
* 判断括号是否有效
* @param str 输入的字符串
* @return 括号有效的话返回真
*/
public static boolean bracketIsEffect(String str) {
// 去除空格
str = str.replace(" ", "");
while (str.contains("()") || str.contains("[]") || str.contains("{}")) {
str = str.replace("{}", "");
str = str.replace("[]", "");
str = str.replace("()", "");
}
return str.isEmpty();
}
每次遍历字符串以及对字符串的修改操作都会产生新字符串,因此对内存的消耗很大,效率很低,不建议使用,
但是简单便于理解,适合刚入门的小白使用。
第二种方法(栈)
步骤梳理:
① 遇见左括号,将左括号入栈
② 遇到右括号
- 如果此时栈是空的,则说明括号无效,返回false
- 如果栈不为空,则将栈顶括号字符出栈,与右括号匹配
- 如果左右括号不匹配,则说明无效 返回false
- 如果匹配,则继续扫描下一个括号字符
③所有字符扫描完毕后
- 栈为空,说明括号有效,返回true
- 栈不为空,说明括号无效,返回false
下面看具体实现
/**
* 判断括号是否有效
* @param str 输入的字符串 前提:字符串仅包含三种括号字符
* @return 括号有效的话返回真
*/
public static boolean bracketIsEffectByStack(String str) {
Stack<Character> stack = new Stack<>();
// 去除空格
str = str.replace(" ", "");
int len = str.length();
for (int i = 0; i < len ; i++) {
char c = str.charAt(i);
if (c == '{' || c == '[' || c == '(') { //左括号字符
stack.push(c);
}else {
if (stack.isEmpty()) return false;
char left = stack.pop();
if (left == '(' && c != ')') return false;
if (left == '[' && c != ']') return false;
if (left == '{' && c != '}') return false;
}
}
return stack.isEmpty();
}
利用 HashMap 简化 方法二
public static boolean bracketIsEffectByMap(String str) {
Map<Character, Character> map = new HashMap<>();
map.put('(', ')');
map.put('[', ']');
map.put('{', '}');
Stack<Character> stack = new Stack<>();
// 去除空格
str = str.replace(" ", "");
int len = str.length();
for (int i = 0; i < len; i++) {
char c = str.charAt(i);
if (map.containsKey(c)) { // 左括号字符
stack.push(c);
} else {
if (stack.isEmpty())
return false;
char left = stack.pop();
if (c != map.get(left))
return false;
}
}
return stack.isEmpty();
}
516

被折叠的 条评论
为什么被折叠?



