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: ...
随机推荐
- ms sql事务输出错误
begin try 语句 end trybegin catch --ERROR_NUMBER() 返回错误号. --ERROR_SEVERITY() 返回严重性. --ERROR_STATE() 返回 ...
- 网络流媒体协议之——RTSP协议
RTSP(Real-Time Stream Protocol)协议是一个基于文本的多媒体播放控制协议,属于应用层.RTSP以客户端方式工作,对流媒体提供播放.暂停.后退.前进等操作.该标准由IETF指 ...
- vue--实现跑马灯效果
<div id="app"> <input type="button" value="开始" @click="l ...
- 6.Python网络编程_全局变量基础
变量作用域: 一般在函数体外定义的变量成为全局变量,在函数内部定义的变量称为局部变量.全局变量所有作用域都可用,局部变量只能在本函数可用,变量的使用顺序是,局部变量 > 全局变量, 也就是说:优 ...
- c# 第29节 类
本节内容: 1:类是什么 2:声明类 3:类的使用 1:类是什么 2:声明类 在生产上的声明:如下操作 或者快捷操作 ctrl+shift+a 键 出现如下界面: 3:类的使用 using Sys ...
- [C3] Andrew Ng - Neural Networks and Deep Learning
About this Course If you want to break into cutting-edge AI, this course will help you do so. Deep l ...
- CF613B Skills
CF613B Skills 洛谷评测传送门 题目描述 Lesha plays the recently published new version of the legendary game hack ...
- ICCV
ICCV 简介 ICCV 的全称是 IEEE International Conference on Computer Vision,即国际计算机视觉大会,由IEEE主办,与计算机视觉模式识别会议(C ...
- angular设置全局变量,修改监听变量
创建service.module.ts import { NgModule, ModuleWithProviders } from '@angular/core'; import { SomeShar ...
- 【BZOJ3600】没有人的算术(替罪羊树+线段树)
点此看题面 大致题意: 定义任意数对\(>0\),数对之间比大小先比第一位.后比第二位,一开始数列全为\(0\),要求你支持\(a_k=(a_x,a_y)\)和询问区间最大值所在位置两种操作. ...