目录
一、 有效括号序列
给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。数据范围:字符串长度 0\le n \le 100000≤n≤10000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
示例:"()[]{}" ---->true
解析:
1.考虑左右成对才是有效字符串,因此得出,当有奇数个括号时,不是合法括号序列
2.(引入栈stack,帮助来存储左括号)当输入括号为偶数个时,考虑输入为空的情况,没有输入,则return false;
3.当输入左括号时,入栈stack.push()
4.当输入右括号时,看当前栈stack是否为空,为空则说明没有左括号,第一个数就是右边括号,不是合法括号序列输出false; 若不为空则查看右括号是否与当前栈顶元素匹配(array[i] == stack.peek()?),若不匹配,则退说明当前括号无法匹配(不合法),输出false, 退出循环;若匹配则弹出当前栈顶元素stack.pop(),此时继续便利输入的括号,重复上述操作。
5.遍历结束,此时若stack.isEmpty(),则说明栈中左括号全部成功匹配,return true,若栈不为空,说明此时左括号还有,没有全部匹配,return false.
以下两种代码都可实现:
方法一:
import java.util.*;
public class Solution {
public boolean isValid (String s) {
Stack<Character> stack = new Stack<Character>();
char[] ch = s.toCharArray();
if(ch.length == 0) return false;
else{
if (ch.length % 2 == 1) {
return false;
}else {
for (int i = 0; i < ch.length; i++) {
if (ch[i] == '(' || ch[i] == '[' || ch[i] == '{') { //如果 是左括号 则入栈
stack.push(ch[i]);
}else { //如果 是右括号 则出栈 (判断栈是否为空)
if(stack.isEmpty()) {
return false;
}else {
switch (stack.pop()) {
case '{':
if (ch[i] !='}') return false;break;
case '[':
if (ch[i] !=']') return false;break;
case '(':
if (ch[i] !=')') return false;break;
}
}
}
}
if(stack.isEmpty()) {
return true;
}else {
return false;
}
}
}
}
}
方法二:
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>(); //给定一个栈用来存放字符
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i); //将输入字符串s转换为字符
if (ch == '(' || ch == '[' || ch =='{') { //判断是否为左括号,是的话写入栈
stack.push(ch);
}else { //遇到右括号 查看匹配
if (stack.empty()) {
System.out.println("右括号多");
return false;
}
char top = stack.peek(); //获取栈顶元素 是否有与之对应的括号 哪个左括号
if (top == '{' && ch =='}' || top == '[' && ch ==']' ||
top == '(' && ch ==')') {
stack.pop();
}else {
System.out.println("左右括号不匹配");
return false;
}
}
}
if (!stack.empty()) {
System.out.println("左括号多");
return false;
}
return true;
}