题目 678. 有效的括号字符串

给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:

任何左括号 ( 必须有相应的右括号 )。

任何右括号 ) 必须有相应的左括号 ( 。

左括号 ( 必须在对应的右括号之前 )。

* 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。

一个空字符串也被视为有效字符串。

示例 1:

输入: "()"

输出: True

示例 2:

输入: "(*)"

输出: True

示例 3:

输入: "(*))"

输出: True

注意:

字符串大小将在 [1,100] 范围内。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/valid-parenthesis-string

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

  • 两个栈,left栈装(,star栈装*。
  • 当遇到),优先pop left栈,若为空则pop*栈,若都为空则返回false。
  • 接下来要处理若两栈内有剩余的情况,两栈同时弹出配对,若left栈弹出元素索引>star栈弹出元素索引,则直接返回false。
  • 最后检查left栈为空则ok,栈可以有任意剩余,因为偶数个可配对,1个*可以作为空串。

代码

import java.util.Stack;

class Solution {
public boolean checkValidString(String s) {
Stack<Integer> left = new Stack<>();
Stack<Integer> star = new Stack<>();
for(int i=0;i<s.length();++i){
char c = s.charAt(i);
if(c=='('){
left.push(i);
}else if(c=='*'){
star.push(i);
}else if(!left.empty()){
left.pop();
}else if(!star.empty()){
star.pop();
}else{
return false;//
}
}
while(!left.empty()&&!star.empty()){
if(left.pop()>star.pop()){
return false;
}
}
System.out.print(star.size());
return left.empty();
}
}

题目

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/valid-parentheses

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

  • 使用map存括号的对应关系。
  • 使用特殊字符入栈底,并设置对应关系,省去栈为空的特殊判断。
  • 使用栈解决。

代码

class Solution {
public static boolean isValid(String s) {
if(s==null){
return true;
} Map<Character,Character> map = new HashMap<>();
map.put('(',')');
map.put('[',']');
map.put('{','}');
map.put('@','@');
LinkedList<Character> stack = new LinkedList<>();
stack.addLast('@'); for(Character c : s.toCharArray()){
if(map.containsKey(c)){
stack.addLast(c);
}else
if(c!=map.get(stack.removeLast())){
return false;
}
}
}
return stack.size()==1;
}
}

[LeetCode]678. 有效的括号字符串、20. 有效的括号(栈)的更多相关文章

  1. [LeetCode] 678. Valid Parenthesis String 验证括号字符串

    Given a string containing only three types of characters: '(', ')' and '*', write a function to chec ...

  2. [leetcode]678. Valid Parenthesis String验证有效括号字符串

    Given a string containing only three types of characters: '(', ')' and '*', write a function to chec ...

  3. Java实现 LeetCode 678 有效的括号字符串(暴力+思路转换)

    678. 有效的括号字符串 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串.有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 ). 任何右括号 ...

  4. Leetcode 678.有效的括号字符串

    有效的括号字符串 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串.有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 ). 任何右括号 ) 必须 ...

  5. LeetCode:有效的括号【20】

    LeetCode:有效的括号[20] 题目描述 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. ...

  6. LeetCode 20. 有效的括号(Valid Parentheses)

    20. 有效的括号 20. Valid Parentheses 题目描述 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须 ...

  7. Java实现 LeetCode 20 有效的括号

    20. 有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. ...

  8. [LeetCode] Valid Parenthesis String 验证括号字符串

    Given a string containing only three types of characters: '(', ')' and '*', write a function to chec ...

  9. [LeetCode] 20. 有效的括号

    题目链接:https://leetcode-cn.com/problems/valid-parentheses/ 题目描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串, ...

随机推荐

  1. Revit二次开发——非模态窗口的事件处理

    一.起因    自己在写revit二开时,有一个Winform窗体按钮点击事件需要 触发调用事务进行处理,结果出现“异常“Starting a transaction from an external ...

  2. Android 使用AS编译出错:找不到xx/desugar/debug/66.jar (系统找不到指定的文件。)

    以为是合作人配置文件的问题,后发现是缓存的问题,只需要Clean project,即可. 若提示无法删除目录:Unable to delete directory,或许是因为你打开了另一个项目,只需关 ...

  3. docker入门2-docker service

    docker service介绍 service是生产环境中某个image的container集合.一个service只使用一个image,但它编排这个image的运行方式,比如使用哪个端口,根据需求 ...

  4. Linux C++向josn文件写入字符串

    对C++了解的不多,我的需求是往JSON文件里写入字符串,这种方式不需要用开源的库,直接写文件就可以.附上代码需要包含studio.h头文件以计fstream long a=123456; char ...

  5. docker简记

    title: docker学习简记 date: 2019-10-16 15:10:39 tags: docker Docker简记 1:Docker简介 1)出现背景 一款产品从开发到上线,从操作系统 ...

  6. 使用IDEA连接mysql后不显示表的解决方案

    使用idea连接mysql后显示如下: 没有显示我们要看的数据表.?????????? 解决方法: 点设置: 选择要看的数据库名称,保存后就OK了.

  7. Microsoft Remote Desktop 10.3.12 下载

    下载地址:https://mac.softpedia.com/

  8. Java 8新特性(一):Lambda表达式

    2014年3月发布的Java 8,有可能是Java版本更新中变化最大的一次.新的Java 8为开发者带来了许多重量级的新特性,包括Lambda表达式,流式数据处理,新的Optional类,新的日期和时 ...

  9. [源码解析] Flink的Slot究竟是什么?(1)

    [源码解析] Flink的Slot究竟是什么?(1) 目录 [源码解析] Flink的Slot究竟是什么?(1) 0x00 摘要 0x01 概述 & 问题 1.1 Fllink工作原理 1.2 ...

  10. 手写Promise简易版

    话不多说,直接上代码 通过ES5的模块化封装,向外暴露一个属性 (function(window){ const PENDING = 'pending'; const RESOLVED = 'fulf ...