题目:
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.
题意:
给定一个只包含字符'(',')','{','}','['和']'的字符串,确定输入字符串是否有效。
括号必须以正确的顺序关闭,“()”和“()[] {}”都有效,但“(]”和“([]]”不是。
代码:
python :
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
n = len(s)
if n < 1 :
return True
left = '({[' #定义入栈的字符集合
dic = {')':'(', '}':'{', ']':'['} #用于匹配出栈的情况
lis = [] #定义一个列表,功能相当于栈
for x in s :
if x in left : #如果是左边的符号,则入栈
lis.append(x)
else : #否则,就是右边的符号,考察匹配情况,看是否需要出栈
if lis != [] and dic[x] == lis[-1] : #栈不空且左右符号匹配上了,则出栈
lis.pop()
else : #如果需要匹配的时候,栈空,或者没匹配上,则不符合
return False
if lis == [] : #匹配完成后,如果栈空,则符合条件,否则还有没完全匹配上的
return True
else :
return False
JAVA:
public class Solution {
public boolean isValid(String s) {
int n = s.length(); //原字符串的长度
char[] str = new char[n]; //定义一个字符数组,充当栈的角色,判断括号匹配情况
int i = 0; //遍历原字符串
int j = 0; //记录str的长度,即栈中的字符个数
while(i < n ){ //开始遍历原字符串
char a = s.charAt(i); //设当前字符串存在a中
if( a == '(' || a == '{' || a == '[') { //如果a是左括号,则直接进栈
str[j] = a;
j++; //栈中元素个数加1
}
else if( a == ')' || a == '}' || a == ']' ) { //如果a是右括号,需要查看匹配情况
if(j==0){ //之前栈是空的,即栈中没有左括号来与a匹配,则直接返回不匹配
return false;
}
else if( a == ')' ) { //否则,栈不空;
if( str[j-1] != '('){ //如果a是‘)’,则判断栈顶元素是否是‘(’,如果不是,则不匹配;如果是,则匹配,j--,表示退栈
return false;
}
else {
j--;
}
}
else if( a == '}' ) { //同样,判断栈顶是否是'{'
if( str[j-1] != '{'){
return false;
}
else {
j--;
}
}
else{
if( str[j-1] != '['){ //同样,判断栈顶是否是'['
return false;
}
else {
j--;
}
}
}
i++;
}
if(j==0){ //如果将原字符串遍历完,栈是空的,则匹配;否则,不匹配
return true;
}
else {
return false;
}
}
}
笔记:
1、char类型数组的声明和初始化:char[] str = new char[n]; //定义长度为n的字符串数组
字符串数组访问第i个元素: str[i]
2、String 类型访问第i个元素:s.charAt(i)
3、声明和初始化一个字符串:
String a =
"abc"
; 或者
String a =
new
String(
"abc"
);