题目
/**
* @Author hang.wang
* @Date 2023/11/24 10:22
* <p>
* 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
* <p>
* 有效字符串需满足:
* <p>
* 左括号必须用相同类型的右括号闭合。
* 左括号必须以正确的顺序闭合。
* 每个右括号都有一个对应的相同类型的左括号。
* <p>
* <p>
* 示例 1:
* 输入:s = "()"
* 输出:true
* <p>
* 示例 2:
* 输入:s = "()[]{}"
* 输出:true
* <p>
* 示例 3:
* 输入:s = "(]"
* 输出:false
* <p>
* 提示:
* 1 <= s.length <= 104
* s 仅由括号 '()[]{}' 组成
*/
代码
public class Class20 {
public static void main(String[] args) {
Class20 class20 = new Class20();
System.out.println(class20.isValid("([)]"));
System.out.println(class20.isValid("()"));
System.out.println(class20.isValid("()[]{}"));
System.out.println(class20.isValid("(]"));
}
public char exchange(char c) {
switch (c) {
case '(':
return ')';
case ')':
return '(';
case '[':
return ']';
case ']':
return '[';
case '{':
return '}';
case '}':
return '{';
}
return ' ';
}
public boolean isValid(String s) {
if (s.length() % 2 != 0) {
return false;
}
if (s.length() == 1) {
if (isPost(s.charAt(0))) {
return false;
}
}
Deque<Character> queue = new ArrayDeque<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (isPost(c)) {
try {
Character remove = queue.removeFirst();
if (exchange(c) != remove) {
return false;
}
} catch (Exception e) {
return false;
}
} else {
queue.addFirst(c);
}
}
return queue.isEmpty();
}
public boolean isPost(char c) {
switch (c) {
case ')':
case ']':
case '}':
return true;
}
return false;
}
}
解析
利用堆栈的特性,如果判断是前括号,就存进去,如果是后括号,就取出来一个值,然后判断这俩是否匹配