题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
举例:
输入:s = "()[]{}"
输出:true
输入:s = "([])}}"
输出:false
思路:使用堆栈
1.遍历字符串,遇到左括号压入堆栈
2.遇到右括号--堆栈是否为空-- 堆栈空,false
-- 堆栈非空,栈顶和当前右括号是否为一对-- 是,栈顶弹出
-- 否,false
3遍历结束,堆栈空---True,反之---False
python:
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
stack = []
pairs = {")":"(", "]":"[", "}":"{"}
if len(s) % 2 == 1:
return False
for i in (s):
if i in ("(","[","{"):
stack.append(i)
else:
if len(stack) == 0:
return False
elif stack[-1] == pairs[i]:
stack.pop()
else:
return False
if len(stack) == 0:
return True
else:
return False
java:
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class SolutionTwenty {
public static void main(String[] args) {
SolutionTwenty solutionTwenty = new SolutionTwenty();
boolean bool = solutionTwenty.isValid("[]{}})");
System.out.println(bool);
}
public boolean isValid(String s) {
// 创建一个空栈
Stack<Character>stack = new Stack<Character>();
// 创建一个Map集合接收括号对内容
Map<Character, Character> pairs = new HashMap<>();
pairs.put(')','(');
pairs.put(']','[');
pairs.put('}','{');
// 创建一个集合存放左括号
Collection<Character> pairsLeft = pairs.values();
// 括号为单数不能构成有效的括号
int len = s.length();
if(len % 2 == 1){
return false;
}
for (char i : s.toCharArray()){
// 遍历传入的参数,如果是左括号压入栈内
if(pairsLeft.contains(i)){
stack.push(i);
}else{
// 如果是右括号,若此时栈为空则为无效括号,如果与栈顶为一对括号则推出栈顶,如果不是一对则也为无效括号
if (stack.isEmpty()){
return false;
} else if (pairs.get(i) == stack.peek()){
stack.pop();
} else{
return false;
}
}
}
// 所有右括号配对后检查此时栈是否为空
if(stack.isEmpty()){
return true;
}else{
return false;
}
}
}