给定一个只包括
'('
,')'
,'{'
,'}'
,'['
,']'
的字符串s
,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true示例 2:
输入:s = "()[]{}" 输出:true示例 3:
输入:s = "(]" 输出:false提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
思路如下:用哈希表来存储所有的括号类型,右括号为键,左括号为值。用栈来存储每个括号对第一次出现的类型(左括号?右括号)。
代码运行解读:首先遍历数组得到每个字符,判断哈希表中是否存在该字符的键,若不存在,则存入栈顶;若存在,则判断栈是否为空,栈顶元素与哈希表中该键对应的值是否相同,如果都符合,移除栈顶元素。最终判断栈是否为空,全空为有效括号,有剩余说明不为有效括号。
题目有个隐含条件为如果为有效括号,则s中的左括号必然在右括号左边。
public static boolean isValid(String s) {
if(s.length()%2==1)return false;
HashMap hashMap=new HashMap<Character,Character>();
hashMap.put(')','(');
hashMap.put('}','{');
hashMap.put(']','[');
LinkedList<Character> stack=new LinkedList<>();
for (int i = 0; i <s.length() ; i++) {
char a=s.charAt(i);
if(hashMap.containsKey(a)){
if(stack.isEmpty()||stack.peek()!=hashMap.get(a))return false;
stack.pop();
}
else stack.push(a);
}
return stack.isEmpty();
}