leetcode第四天|leetcode第四天 : 有效的括号
有效的括号
题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合
- 左括号必须以正确的顺序闭合。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
思路
① 首先确定输入的字符串必定为空串或者是括号串
② 如果遇到空串直接返回true, 否则如果第一个括号是右单边括号, 直接返回false
③ 根据题意, 符合要求的括号串, 必定是成对出现, 否则不满足题意, 示例4是一种非常特殊的情况, 因为它虽然看起来是两对括号匹配的, 实际上在
'[)'
中已经被判为false, 违反了第二条规则④ 把所有的左单边括号放在栈中, 如果遇到右单边括号, 则需弹出栈顶的左单边括号进行判断
⑤ 正确的顺序是指每次遇到右单边括号时, 都要与栈顶的左单边括号相匹配
⑥ 编程实现
例子
假设括号串为
{}()({[]})
文章图片
有效的括号.png 编程
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(""));
}}
总结
【leetcode第四天|leetcode第四天 : 有效的括号】说实话, 效率不堪一击, 内存还看得过去, 不过我还是不太懂内存消耗的影响因素是什么, 哈哈哈哈, 感觉自己做出来了就很不错了......看了别人的题解, 感觉自己写的弱爆了, 下面给出别人的简单解法, 太简洁了
class Solution {
public boolean isValid(String s) {
char[] array = s.toCharArray();
Stack 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)
推荐阅读
- 第7次(大复盘作业《思考力的坐标、公式和模型》八步创作心法)
- 中原焦点团队|中原焦点团队 网络中级第19期 吕娟坚持分享第334天
- 临时抱佛脚,没得用
- 别碰我——第四章
- 第四次心理课打卡―马文霞
- 第三方登录获取签名文件的坑
- 千红公主第二章夜游第一节金色羽毛
- jieqian的ScalersTalk第四轮新概念朗读持续力训练Day69|jieqian的ScalersTalk第四轮新概念朗读持续力训练Day69 20181215
- 第一次家排课带给我的2018.5.27
- 水彩小白的海底世界