leetcode - 括号字符串是否有效
括号字符串是否有效
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
```
/**
* 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
* 有效字符串需满足:
* 左括号必须用相同类型的右括号闭合。
* 左括号必须以正确的顺序闭合。
* 注意空字符串可被认为是有效字符串。
* <p>关键点在于<b>括号对应</b>, 所以需要提前保存括号, 这里使用键值对比较合适</p>
* @param s
* @return
*/
public static boolean checkValidString(String s) {
// 执行用时 :4 ms, 在所有 java 提交中击败了71.86%的用户
//内存消耗 :34.2 MB, 在所有 java 提交中击败了85.82%的用户
if(s == null || s .equals("")) {
return true;
}
// 保存括号对应关系
Map<Character, Character> map = new HashMap<>(3);
map.put('(',')');
map.put('{','}');
map.put('[',']');
// 左括号集合
Set<Character> keys = map.keySet();
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char temp = s.charAt(i);
if(i == 0 && !keys.contains(temp)) {
return false;
}
if(keys.contains(temp)) {
stack.push(temp);
} else {
if(temp != (stack.isEmpty() ? '#' : map.get(stack.pop()))) {
return false;
}
}
}
return stack.isEmpty();
// 没用过java的栈结构, 所以使用了LinkedList, 但是执行时间和空间都比较大
// 执行用时 :15 ms, 在所有 java 提交中击败了9.23%的用户
//内存消耗 :36.1 MB, 在所有 java 提交中击败了40.88%的用户
/* String[] strings = s.split("");
LinkedList<String> strList = new LinkedList<>();
for (int i = 0; i < strings.length; i++) {
if(keys.contains(strings[i])) {
strList.add(strings[i]);
} else {
if(i == 0 || (i != 0 && strList.size() == 0)) {
return false;
} else {
// 判断括号是否匹配
if(strings[i].equals(map.get(strList.getLast()))) {
strList.removeLast();
continue;
} else {
return false;
}
}
}
}
if(strList.size() == 0) {
return true;
}
return false;*/
}
/**
* 执行用时 :3 ms, 在所有 java 提交中击败了86.43%的用户
* 内存消耗 : 34.4 MB, 在所有 java 提交中击败了 84.17%的用户
* @param s
* @return
*/
public static boolean checkValidString1(String s) {
if(s == null || s .equals("")) {
return true;
}
// 保存括号对应关系
Map<Character, Character> map = new HashMap<>(3);
map.put(')','(');
map.put('}','{');
map.put(']','[');
// 左括号集合
Set<Character> keys = map.keySet();
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
Character temp = s.charAt(i);
if(keys.contains(temp)) {
Character element = stack.isEmpty() ? '#' : stack.pop();
if(!element.equals(map.get(temp))) {
return false;
}
} else {
stack.push(temp);
}
}
return stack.isEmpty();
}
public static void main(String[] args) {
/* String s1 = "{}[]()";
String s2 = "([{}])";
String s3 = "][(){}";
String s4 = "({(())}";*/
String s5 = "[])";
// true
/* System.out.println(checkValidString(s1));
// true
System.out.println(checkValidString(s2));
// false
System.out.println(checkValidString(s3));
// false
System.out.println(checkValidString(s4));*/
System.out.println(checkValidString(s5));
}
```
leetcode - 括号字符串是否有效的更多相关文章
- [LeetCode] Valid Parenthesis String 验证括号字符串
Given a string containing only three types of characters: '(', ')' and '*', write a function to chec ...
- [leetcode]678. Valid Parenthesis String验证有效括号字符串
Given a string containing only three types of characters: '(', ')' and '*', write a function to chec ...
- [LeetCode]678. 有效的括号字符串、20. 有效的括号(栈)
题目 678. 有效的括号字符串 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串.有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 ). 任何 ...
- Leetcode 678.有效的括号字符串
有效的括号字符串 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串.有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 ). 任何右括号 ) 必须 ...
- Java实现 LeetCode 678 有效的括号字符串(暴力+思路转换)
678. 有效的括号字符串 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串.有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 ). 任何右括号 ...
- leetcode 1541. 平衡括号字符串的最少插入次数
问题描述 给你一个括号字符串 s ,它只包含字符 '(' 和 ')' .一个括号字符串被称为平衡的当它满足: 任何左括号 '(' 必须对应两个连续的右括号 '))' . 左括号 '(' 必须在对应的连 ...
- 判断括号字符串是否为合法+求n对括号的所有组合
n对括号的有效组合数 参考:https://zh.wikipedia.org/wiki/%E5%8D%A1%E5%A1%94%E5%85%B0%E6%95%B0 import java.util.Ar ...
- Leetcode中字符串总结
本文是个人对LeetCode中字符串类型题目的总结,纯属个人感悟,若有不妥的地方,欢迎指出. 一.有关数字 1.数转换 题Interger to roman和Roman to integer这两题是罗 ...
- LeetCode:字符串的排列【567】
LeetCode:字符串的排列[567] 题目描述 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: ...
随机推荐
- SRDC - ORA-1555: Query Duration 0: Checklist of Evidence to Supply (Doc ID 1682704.1)
SRDC - ORA-1555: Query Duration 0: Checklist of Evidence to Supply (Doc ID 1682704.1) Action Plan 1. ...
- Python—文件读写操作
初识文件操作 使用open()函数打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了,根据打开文件的方式不同能够执行的操作也会有相应的差异. 打开文件的方式: r, w, a, ...
- Linux:挂载磁盘分区
查看挂载的分区 df 命令主要用来了解系统中已经挂载的各个文件系统的磁盘使用情况. 常用选项: "-h" ,显示更易读的容量单位: "-T" ,显示文件系统的类 ...
- nginx 的 proxy_cache 缓存配置
开头:某个项目涉及到 视频切片下载到本地,然后提供服务给客户端.一个视频有多个文件,存储在本地路径下.当客户端请求的视频在本地没有就会回源, 回源拿到的视频文件再返回给客户端,同时在本地缓存一份,提供 ...
- 不懂这个别说是刷机高手!安卓Recovery你知多少
[PConline 应用]玩过安卓刷机的朋友相信都听说过Recovery,在刷机前,第一步往往是解锁手机,第二部就是刷入Recovery了.利用Recovery读取第三方Rom并刷入系统,才能实现刷机 ...
- git 推送本地项目到远程库
git 推送本地项目到远程库 1@DESKTOP-3H9092J MINGW64 /e/mozq/00store/01/SmartCard_MS $ git init Initialized empt ...
- 编译安装nmap
官方编译文档 参考 安装对应的库,并编译安装.
- <Math> 258 43
258. Add Digits class Solution { public int addDigits(int num) { if(num == 0) return 0; if(num % 9 = ...
- Windows开机自动登录账户
如何在Windows设了账户密码的情况下开机自动登录账户,有以下两种方法. 通过Windows设置自动登录 按“Win+R”组合键打开“运行”框内输入“netplwiz”. 打开以下窗口,将“要使用本 ...
- C# 位运算基本大全
1.原码 反码 补码 只用补码进行计算,且没有减法.只有用补码进行加法运算,具体原因,详见:http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/C ...