题目描述

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true
  • 思路1,创建一个空栈,当字符串不为空时,从第一个字符开始遍历字符串,如果遇到’(‘、’[‘、’{‘,就将字符压入一个栈中;如果遇到’)’、’]’、’}’,则判断此时栈顶的元素是否是对应的前括号比如')'对应'(',如果满足对应关系,就将栈顶元素取出,继续遍历,如果不满足对应关系,则返回false。遍历完成后,如果栈不为空,返回false,反之返回true。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.Stack;
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
char[] arry = s.toCharArray();
for(int i=0;i<arry.length;i++){
if(arry[i]=='('||arry[i]=='['||arry[i]=='{')
stack.push(arry[i]);
else{
char top = stack.peek();
if((top=='('&&arry[i]==')')||(top=='['&&arry[i]==']')||(top=='{'&&arry[i]=='}'))
stack.pop();
else stack.push(arry[i]);
}
}
return stack.isEmpty();
}
  • 思路2,改进方法1
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for(char c: s.toCharArray()){
if(c=='(') stack.push(')');
else if(c=='[') stack.push(']');
else if(c=='{') stack.push('}');
else if(stack.isEmpty()||c!=stack.pop()) return false;
//注意此处的pop
}
return stack.isEmpty();
}
}
  • 思路3,利用python的replace。一直遍历字符串,如果发现满足条件的括号对————‘()’、’[]’、’{}’,那么,将他们用空字符代替,如果最后,字符串为空,返回true,反之,返回false。
1
2
3
4
5
6
7
class solution(object):
def isValid(self, s):
while '()' in s or '[]' in s or '{}' in s:
s = s.replace('()', '')
s = s.replace('[]', '')
s = s.replace('{}', '')
return s == ''

总结,括号总是成对的,在最内层一定存在相邻的成对存在的括号。