题目:
Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
The brackets must close in the correct order, "()"
and "()[]{}"
are all valid but "(]"
and "([)]"
are not.
分析:
本题考查的是栈结构,具有后进先出的特性。有效包含2个方面,第一个是如果是关闭的括号,前一位一定要刚好有一个开启的括号;第二个是最终结果,需要把所有开启的括号都抵消完。一个比较容易出错的地方是,遇到关闭括号时,要先判断栈是否已经空了。
Java版本一:
public class Solution {
public boolean isValid(String s) {
char[] charArr=s.toCharArray();
List<Character> list=new ArrayList<>();
for(Character c:charArr){
if(c=='('||c=='{'||c=='['){
list.add(c);
}else{
if(list.size()==0){
return false;
}
char last=list.get(list.size()-1);
if(c==')'&&last!='('){
return false;
}else if(c=='}'&&last!='{'){
return false;
}else if(c==']'&&last!='['){
return false;
}
list.remove(list.size()-1);
}
}
if(list.size()!=0){
return false;
}
return true;
}
}
采用ArrayList数据结构,从开括号开始计算,list.size()==0就是用来保证第一个进入list集合的是开括号,last变量是用来取list集合中最后一个值,也就是取开括号的值,然后与后面输入的数组中c值进行匹配,(此处list实际就是用来保存开括号的字符,并当匹配成功后,对list集合进行清空,接着接收下一个开括号字符)匹配成功后,就在list集合中删除开括号的值,保证list集合为空,然后接着进行循环,接收开括号的字符值,再进行循环判断。
Java版本二:
public class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
// Iterate through string until empty
for(int i = 0; i<s.length(); i++) {
// Push any open parentheses onto stack
if(s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{')
stack.push(s.charAt(i));
// Check stack for corresponding closing parentheses, false if not valid
else if(s.charAt(i) == ')' && !stack.empty() && stack.peek() == '(')
stack.pop();
else if(s.charAt(i) == ']' && !stack.empty() && stack.peek() == '[')
stack.pop();
else if(s.charAt(i) == '}' && !stack.empty() && stack.peek() == '{')
stack.pop();
else
return false;
}
// return true if no open parentheses left in stack
return stack.empty();
}
}
此处主要是应用了堆栈这个数据结构,后进先出,原理跟java(一)中类似,开括号进栈,匹配成功后出栈,保证栈这个数据结构为空,即全符合条件。
Python版本:
class Solution:
# @return a boolean
def isValid(self, s):
stack = []
dict = {"]":"[", "}":"{", ")":"("}
for char in s:
if char in dict.values():
stack.append(char)
elif char in dict.keys():
if stack == [] or dict[char] != stack.pop():
return False
else:
return False
return stack == []
原理类似,就是用的dict字典型,直接在字典类型中进行配对,节省了判断条件的代码量。
C++版本:
#include <stack>
class Solution {
public:
bool isValid(string s) {
stack<char> paren;
for (char& c : s) {
switch (c) {
case '(':
case '{':
case '[': paren.push(c); break;
case ')': if (paren.empty() || paren.top()!='(') return false; else paren.pop(); break;
case '}': if (paren.empty() || paren.top()!='{') return false; else paren.pop(); break;
case ']': if (paren.empty() || paren.top()!='[') return false; else paren.pop(); break;
default: ; // pass
}
}
return paren.empty() ;
}
};
C++主要运用的也是stack数据结构,独特点是通过switch进行配对。