题目描述
给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。
示例1:
输入:"["
输出:false
示例2:
输入:"[]"
输出:true
CODE
- java版:
import java.util.*;
public class Solution {
/**
*
* @param s string字符串
* @return bool布尔型
*/
public boolean isValid (String s) {
// write code here
// write code here
if (s == null) {
return false;
}
//判断字符串长度是奇数偶数,奇数返回false
if ((s.length() & 1) == 1) {
return false;
}
Stack<Character> stack = new Stack();
for (char c : s.toCharArray()) {
if ('(' == c) {
stack.push(')');
} else if ('{' == c) {
stack.push('}');
} else if ('[' == c) {
stack.push(']');
} else if (stack.isEmpty() || stack.pop() != c) {
return false;
}
}
return stack.isEmpty();
}
}
- python3版
#
#
# @param s string字符串
# @return bool布尔型
#
class Solution:
def isValid(self , s ):
# write code here
if not s: return False
if len(s) % 2 != 0: return False
stack = []
for c in s:
if '(' == c:
stack.append(')')
elif '{' == c:
stack.append('}')
elif '[' == c:
stack.append(']')
elif len(stack) == 0 or stack.pop() != c:
return False
return len(stack) == 0
class Solution:
def isValid(self, s: str) -> bool:
if s is None or len(s)==0 or len(s)%2!=0: return False
dic = {'[':']', '{':'}', '(':')'}
stack = []
for c in s:
if c in dic:
stack.append(dic[c])
elif len(stack)==0 or stack.pop()!=c:
return False
return len(stack) == 0
思想
解题思路:采用栈解决。括号为pair对,当括号为左括号['(', '[', '{')]时,将对应右字符[')', ']', '}')]压入栈(便于后面判断是否匹配);当括号为右括号时,判断栈顶元素是否与之匹配,不匹配或者为空,则返回false, 匹配,则pop出栈顶。
- 首先判断字符串初始状态:为null返回fasle; 长度为奇数返回false(合法括号序列肯定是偶数);
- 以左括号为基准进行遍历判断:
- 每次进来新的括号:
- 若为左括号,则压入栈(等待后面进来对应右括号出栈);
- 若为右括号,判断此时栈是否为空,为空则返回false(说明以右括号开头了,不合法,如'()}{'或'){}(';若不为空,弹出栈顶并判断是否与之匹配,不匹配则返回false,如’[(])‘,匹配继续遍历;
- 遍历完,判断栈是否为空,为空,说明匹配正常,返回true; 不为空,说明做括号多于右括号,积压在栈里,返回false, 如:’(){}[]((‘,最后栈里剩’((‘
- 每次进来新的括号: