题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
示例 1:
- 输入: “()”
- 输出: true
示例 2:
- 输入: “()[]{}”
- 输出: true
示例 3:
- 输入: “(]”
- 输出: false
示例 4:
- 输入: “([)]”
- 输出: false
示例 5:
- 输入: “{[]}”
- 输出: true
Java代码
class Solution {
// 建立左右括号的映射关系
static Map<Character, Character> map = new HashMap<Character, Character>(4);
{
map.put('(', ')');
map.put('{', '}');
map.put('[', ']');
}
public boolean isValid(String s) {
if (s == null || (s.length() % 2 != 0)) return false;
if (s.equals("")) return true;
int first = 0;
// 主要用栈存储左括号
Stack<Character> stack = new Stack<Character>();
while (first < s.length()) {
// 从左往右获取字符串中的字符
char charLeft = s.charAt(first++);
// 如果获取的字符是map中的key,即左括号
if (map.containsKey(charLeft)) {
// 则把字符入栈
stack.push(charLeft);
} else {
// 如果栈为空 则返回false 避免一开始碰到右括号的情况
if(stack.empty()) return false;
// 如果遇见右括号 则把栈顶字符去除看是否符合map映射
if (map.get(stack.pop()) != charLeft) {
return false;
}
}
}
// 如果栈内还有字符 则不匹配
return stack.empty();
}
}
结果
执行用时 :5 ms, 在所有 Java 提交中击败了79.05%的用户
内存消耗 :34.9 MB, 在所有 Java 提交中击败了82.47%的用户