LeetCode Day 10
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (s) {
let left = ['(', '[', '{']
let right = [')', ']', '}']
let stack = [];
for (let c of s) {
let index = left.indexOf(c);
if (index > -1) {
stack.push(c);
} else {
if (stack.length === 0) return false;
let end = stack[stack.length - 1];
if (left.indexOf(end) !== right.indexOf(c)) return false;
stack.pop();
}
}
return stack.length === 0;
};
//console.log(isValid('([)]'));
console.log(isValid('{[]}'));
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路:
- 简单的递归考虑,想生成n对,势必n-1对已经生成了;
- 对于n-1对的情况进行处理,第n对,不外乎在n-1对所有合理数组前面加一个"()",或者后面加一个"()",又或者用左右括号将n-1对的情况包起来;
- 简单的过滤掉重复项:
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function (n) {
if (n === 0) return [];
if (n === 1) {
return ['()'];
}
else {
let arr = generateParenthesis(n - 1);
let result = [];
result = result.concat(arr.map(x => '()' + x));
result = result.concat(arr.map(x => x + '()'));
result = result.concat(arr.map(x => '(' + x + ')'));
return result.filter((element, index, arr) => arr.indexOf(element) === index);
}
};
- 按示例测试了一下,没错,兴冲冲的提交一下,直接就WA了。
执行结果:
解答错误
显示详情
输入:
4
输出
["()()()()","()()(())","()(())()","()(()())","()((()))","(())()()","(()())()","((()))()","(()()())","(()(()))","((())())","((()()))","(((())))"]
预期结果
["(((())))","((()()))","((())())","((()))()","(()(()))","(()()())","(()())()","(())(())","(())()()","()((()))","()(()())","()(())()","()()(())","()()()()"]
- 写个小代码比较一下看看究竟缺少了什么:
function compareTwoArray(a, b) {
let result = [];
for (let i of b) {
if (a.indexOf(i) === -1) {
result.push(i);
}
}
return result;
}
- 输出的是
[ '(())(())' ]
,可以看到对于大于1的数组,中心区不一定只有()
,也可能是)(
,因此上面这种简单的想法并不能有效。 - 改进一下:
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function (n) {
if (n === 0) return [];
if (n === 1) {
return ['()'];
}
else {
let arr = generateParenthesis(n - 1);
let result = [];
for (let i = 0, lens = arr.length; i < lens; i++) {
let str = arr[i];
for (let j = 0, lens2 = str.length; j <= lens2; j++) {
result.push(str.slice(0, j) + '()' + str.slice(j));
}
}
return result.filter((element, index, arr) => arr.indexOf(element) === index);
}
};
- 结果n=8时就超时了。
- 问题出在
filter
上了,我们改用Set自动过滤;
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function (n) {
if (n === 0) return [];
if (n === 1) {
return ['()'];
}
else {
let arr = generateParenthesis(n - 1);
let result = [];
for (let i = 0, lens = arr.length; i < lens; i++) {
let str = arr[i];
for (let j = 0, lens2 = str.length; j <= lens2; j++) {
result.push(str.slice(0, j) + '()' + str.slice(j));
}
}
// return result.filter((element, index, arr) => arr.indexOf(element) === index);
let result_set = new Set(result);
result = [];
for (var i of result_set) {
result.push(i);
}
return result;
}
};
- 也可以考虑用另外一种方法来做,假定有
leftBracketCount
(初始值为n)个左括号,rightBracketCount
(初始值也为n)个右括号。对于最终要构造的2n个字符的括号串来说,我们可以一直先用左括号,用完都行,但是我们不能连着用两个右括号,使得rightBracketCount
<leftBracketCount
,因为这样子已经组合好的子串就肯定不是有效括号串了(如已经构成好的子串"())",此时消耗了1个左括号,2个右括号)。
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function (n) {
if (n === 0) return [];
else {
let result = []
dfs('', n, n, result);
return result;
}
};
function dfs(str, leftBracketCount, rightBracketCount, result) {
if (leftBracketCount === 0 && rightBracketCount === 0) {
result.push(str);
}
if (leftBracketCount > rightBracketCount) {
return;
}
if (leftBracketCount > 0) {
dfs(str + '(', leftBracketCount - 1, rightBracketCount, result);
}
if (rightBracketCount > 0) {
dfs(str + ')', leftBracketCount, rightBracketCount - 1, result);
}
}
LeetCode Day 10的更多相关文章
- Leetcode(10)正则表达式匹配
Leetcode(10)正则表达式匹配 [题目表述]: 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或 ...
- leetcode problem 10 Regular Expression Matching(动态规划)
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- 【一天一道LeetCode】#10. Regular Expression Matching
一天一道LeetCode系列 (一)题目 Implement regular expression matching with support for '.' and '*'. '.' Matches ...
- LeetCode(10):正则表达式匹配
Hard! 题目描述: 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整 ...
- 【LeetCode】10.Regular Expression Matching(dp)
[题意] 给两个字符串s和p,判断s是否能用p进行匹配. [题解] dp[i][j]表示s的前i个是否能被p的前j个匹配. 首先可以分成3大类情况,我们先从简单的看起: (1)s[i - 1] = p ...
- 【leetcode】10.Regular Expression Matching
题目描述: Implement regular expression matching with support for '.' and '*'. '.' Matches any single cha ...
- 《LeetBook》leetcode题解(10): Regular Expression Matching——DP解决正则匹配
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
- leetcode笔记10 Intersection of Two Arrays(求交集)
问题描述: Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, ...
- LeetCode第[10]题(Java):Regular Expression Matching
题目:匹配正则表达式 题目难度:hard 题目内容:Implement regular expression matching with support for '.' and '*'. '.' Ma ...
- LeetCode(10) Regular Expression Matching
题目 Implement regular expression matching with support for '.' and '*'. '.' Matches any single charac ...
随机推荐
- selenium滚动条应用,爬永远讲不完的故事
from selenium import webdriver class Lj(object): def __init__(self): self.driver = webdriver.Chrome( ...
- Android通过包名打开第三方应用
import android.content.ComponentName; import android.content.Context; import android.content.Intent; ...
- macos上命令行查看磁盘序列号
收集到两种命令行获取方法:(另外https://www.maketecheasier.com/find-mac-serial-number/中还说明了GUI模式下的查看方法) 1.system_pro ...
- C++概要简介
从C到C++ 新类型 bool类型 新的输入输出方式 con cout 新的内存存储方式 new delete 引用& 用于传参 函数 内敛函数inline 通过代码区膨胀 减少函数的跳转时间 ...
- 2019CSP-J游记
2019-10-19:开一个坑,今天初赛,我是我们考场唯一几个坚持到16:45收卷的人,我们是机试,竟然可以用编译器. 这次初赛总体感觉打得不错,卷面满分200,最后实际分数,就是卷面分除以二. 初赛 ...
- BBS注册功能
BBS注册功能 一.后端 1.组件校验数据 """ @author RansySun @create 2019-11-03-11:35 """ ...
- 学习数论 HDU 4709
经过杭师大校赛的打击,明白了数学知识的重要性 开始学习数论,开始找题练手 Herding HDU - 4709 Little John is herding his father's cattles. ...
- BSC交流
深圳建筑科学研究院 IT规划咨询项目 1999-2000年 平衡计分卡项目少 绩效管理 财务指标 考核 定量 考核国企 客户 产品 双重 市场 路径.方向的设计战略地图的工具,思维地图是怎么, 战略解 ...
- 吴裕雄--天生自然 pythonTensorFlow图形数据处理:数据集基本使用方法
import tempfile import tensorflow as tf # 1. 从数组创建数据集. input_data = [1, 2, 3, 5, 8] dataset = tf.dat ...
- selenium自学进度-2014.12.3
今天把小米系列的视频看到了倒数第二课 他讲得很好,只是我现在是看第一遍,回头还需要照着视频多练练. 成长的道路问题艰辛的,学习的道路问题孤独的,希望自己能够坚持下去. 不要让今天的努力白费,不能让未来 ...