需求
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1、左括号必须用相同类型的右括号闭合。
2、左括号必须以正确的顺序闭合。
解题思路
- 如果字符串的长度是奇数,那么肯定不满足条件,直接返回false
- 如果字符串长度为偶数,利用栈数据结构,先进后出,当括号正确闭合,则弹栈
- 首先将字符串转换成字符数组遍历,得到每一个字符
- 判断当前字符是左括号还是右括号
- 如果是左括号,添加到栈中
- 如果是右括号,找到栈中最后一个元素,查看是否是相同类型的括号
- 如果是相同类型的括号,则将栈尾元素弹栈
- 如果不是相同类型的括号,证明没有按照顺序闭合,直接返回false
- 遍历结束后,如果栈中的元素都弹栈完毕,栈为空,证明所有括号已按顺序闭合,返回true
代码实现
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* 给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。
* 有效字符串需满足:
* 左括号必须用相同类型的右括号闭合。
* 左括号必须以正确的顺序闭合。
*/
public class Test {
public static void main(String[] args) {
String str = "([)]";
System.out.println(isValid(str));
}
public static boolean isValid(String s) {
if (s.length() % 2 == 0) {
ArrayList<Character> left = new ArrayList<>(List.of('(', '[', '{'));
ArrayList<Character> right = new ArrayList<>(List.of(')', ']', '}'));
LinkedList<Character> list = new LinkedList<>();
char[] chars = s.toCharArray();
for (char c : chars) {
//如果是左括号,添加到链表中
if (left.contains(c)) {
list.add(c);
}
//如果是右括号,取出链表中最后一个插入的元素,看是否是同一个类型的,如果不是,直接返回false
if (right.contains(c)) {
//如果是右括号,但是链表中没有元素,返回false
if (list.isEmpty()) {
return false;
}
Character last = list.getLast();
//如果最后一个是小括号 last=='('
if (last == '(') {
//如果当前字符也是小括号c==')'
if (c == ')') {
//匹配成功,弹栈
list.removeLast();
} else {
//匹配失败,返回false
return false;
}
} else if (last == '[') {
//最后一个是中括号
if (c == ']') {
//匹配成功,弹栈
list.removeLast();
} else {
return false;
}
} else if (last == '{') {
//最后一个是大括号
if (c == '}') {
//匹配成功,弹栈
list.removeLast();
} else {
return false;
}
}
}
}
//当链表元素为空的时候,证明全部匹配成功,返回true,否则返回false
if (list.isEmpty()) {
return true;
}
}
return false;
}
}