有效的括号
题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
思路
① 首先确定输入的字符串必定为空串或者是括号串
② 如果遇到空串直接返回true, 否则如果第一个括号是右单边括号, 直接返回false
③ 根据题意, 符合要求的括号串, 必定是成对出现, 否则不满足题意, 示例4是一种非常特殊的情况, 因为它虽然看起来是两对括号匹配的, 实际上在'[)'
中已经被判为false, 违反了第二条规则
④ 把所有的左单边括号放在栈中, 如果遇到右单边括号, 则需弹出栈顶的左单边括号进行判断
⑤ 正确的顺序是指每次遇到右单边括号时, 都要与栈顶的左单边括号相匹配
⑥ 编程实现
例子
假设括号串为{}()({[]})
编程
import java.util.Stack;
/**
* @author Jack
* @date 2019-06-16-18:43
*/
public class Solution {
public static boolean isValid(String s) {
//切割字符串, 分成一个个单边括号
String[] split = s.split("");
Stack stack = new Stack();
for (int i = 0;i <= split.length -1; i++){
//判断是否为左边括号
if(split[i].equals("{")||split[i].equals("[")||split[i].equals("(")){
stack.push(split[i]);
continue;
//第一个元素不是左单边括号
}else if(i == 0){
//如果为空串则返回真
if ("".equals(split[0])){
return true;
//右单边括号
}else{
return false;
}
}else{
//判断最后一个元素是右单边括号且栈为空时, 不符合规则, 示例 : "()]"
if(i == split.length-1 && stack.empty() && (split[i].equals("}")||split[i].equals("]")||split[i].equals(")"))){
return false;
}
//取出栈顶元素进行判断
if(!stack.empty()) {
String pop = (String) stack.pop();
switch (split[i]){
case "}":
if("{".equals(pop)){
//如果已经遍历到最后一个元素, 且匹配, 而且没有多余的左单边括号, 则返回true
if(i == split.length -1 && stack.empty()) {
return true;
}
continue;
//与栈顶的左单边括号不匹配,返回false
}else{
return false;
}
case "]":
if("[".equals(pop)){
if(i == split.length -1 && stack.empty()){
return true;
}
continue;
}else{
return false;
}
case ")":
if("(".equals(pop)){
if(i == split.length -1 && stack.empty()){
return true;
}
continue;
}else{
return false;
}
default:
return false;
}
}
}
}
return false;
}
public static void main(String[] args) {
System.out.println(isValid(""));
}
}
总结
说实话, 效率不堪一击, 内存还看得过去, 不过我还是不太懂内存消耗的影响因素是什么, 哈哈哈哈, 感觉自己做出来了就很不错了......看了别人的题解, 感觉自己写的弱爆了, 下面给出别人的简单解法, 太简洁了
class Solution {
public boolean isValid(String s) {
char[] array = s.toCharArray();
Stack<Character> stack = new Stack<>();
for (char c : array) {
if (c =='(' || c =='[' || c =='{') {
stack.push(c);
}else if(stack.isEmpty()){
return false;
}else if (c ==')' && stack.peek()=='(') {
stack.pop();
} else if (c ==']' && stack.peek()=='[') {
stack.pop();
} else if (c =='}' && stack.peek()=='{') {
stack.pop();
}else{
return false;
}
}
if(!stack.isEmpty()){
return false;
}
return true;
}
}
作者:vicyas
链接:https://leetcode-cn.com/problems/two-sum/solution/zui-pu-tong-de-jie-fa-by-vicyas/
来源:力扣(LeetCode)