题目描述:
给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
注意:空字符串可被认为是有效字符串。
题目示例:
示例 :
输入: “()”
输出: true
输入: “()[]{}”
输出: true
输入: “([)]”
输出: false
输入: “{[]}”
输出: true
做题思路一:
在“有效的括号”中,不论是 ()
还是 []
还是 {}
,肯定都是成对出现的,不会有半边括号出现,所以我们只需要用 replace()
方法将字符串中的 ()
, []
,{}
全部替换成空字符串 ''
即可。如果将全部成对出现的括号全部替换为空字符串的话,字符串的长度应该为 0 。如果不为 0 说明字符串不是一个 “有效的括号” 字符串。
做题思路二:
关于这道题我们可以用 栈 这个数据结构来做。我们知道栈是后进先出的数据结构,这样的特性方便我们进行左右括号的对比,先来看下大体的思路:
- 遍历整个字符串,如果是左括号就入栈;
- 如果是右括号则查看当前栈顶元素是否与之相匹配,如果不匹配直接返回 false;
- 遍历完成之后,如果栈内没有元素则说明全部匹配成功,返回 true;如果栈内还有元素则说明不匹配,返回 false,其实直接 return stack == 0 就行。
代码一:
class Solution {
/*
无限循环,每次将成对的括号替换为空字符串
如果替换之前和替换之后的长度一样,说明没有成对的字符串,或者字符串为空字符串,跳出循环体
如果替换之前和替换之后的长度不一样,说明有成对的字符串被替换掉,继续循环替换成对的字符串
直到替换之前和替换之后的长度一样,跳出循环体为止
最后判断字符串的长度是否为 0 来判断字符串是否是有效的括号
@param s
@return
*/
public boolean isValid(String s) {
int length;
while (true) {
length = s.length();
s = s.replace(“()”,””);
s = s.replace(“[]”,””);
s = s.replace(“{}”,””);
if (length == s.length()) {
break;
}
}
return length == 0;
}
}
代码二:
class Solution {
public boolean isValid(String s) {
Stack
for (int i = 0; i < s.length(); i++) {
// 如果是左括号就入栈
if (s.charAt(i) == ‘{‘|| s.charAt(i) == ‘[‘ || s.charAt(i) == ‘(‘) {
stack.push(s.charAt(i));
}
// 如果是右括号就判断栈是否为空,以及栈顶是否和右括号匹配,如果不匹配直接可以返回 false
if (s.charAt(i) == ‘]’) {
if (stack.isEmpty() || stack.peek() != ‘[‘) {
return false;
}
stack.pop();
}
if (s.charAt(i) == ‘}’) {
if (stack.isEmpty() || stack.peek() != ‘{‘) {
return false;
}
stack.pop();
}
if (s.charAt(i) == ‘)’) {
if (stack.isEmpty() || stack.peek() != ‘(‘) {
return false;
}
stack.pop();
}
}
// 如果全部匹配,则栈为空,否则不为空
return stack.isEmpty();
}
}