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 ...
随机推荐
- CSS3 media媒体查询器的使用方法
最近几年随着响应式布局的发展,一次开发多次使用,自适应屏幕的响应式网站的需求越来越多.但是怎样使得网站能自适应屏幕呢?这里就需要提到一个css3里面新增的技术了-media媒体查询器. 那么什么是me ...
- 基于ssh开发彩票购买系统的设计与实现毕业设计
开发环境: Windows操作系统开发工具: MyEclipse+Jdk+Tomcat+MYSQL数据库 运行效果图: 源码及原文地址:http://javadao.xyz/forum.php?mod ...
- 题解 P1829 【[国家集训队]Crash的数字表格 / JZPTAB】
题目 我的第一篇莫比乌斯反演题解 兴奋兴奋兴奋 贡献一个本人自己想的思路,你从未看到过的船新思路 [分析] 显然,题目要求求的是 \(\displaystyle Ans=\sum_{i=1}^n\su ...
- 题解 P2831 【愤怒的小鸟】
题目 我的天,这题是真的卡精度...... 主要是精度很不好处理,经本蒟蒻测验,精度在\(10^{-6}\)会比较好优雅 [分析] 对于这种某个变量特别小\((\leq 31)\)的题目,本蒟蒻第一反 ...
- 微服务项目开发学成在线_day02 CMS前端开发
1 Vue.js与Webpack研究 开发版的浏览器:https://www.google.cn/intl/zh-CN/chrome/dev/ 前端的开发框架:微服务项目开发学成在线_Vue.js与W ...
- 在CentOS7上从源码编译安装redis,并做成服务程序
1.安装编译的依赖环境 # 安装pcre开发包: yum install -y pcre-devel # 安装ssl功能需要openssl库 yum -y install openssl-devel ...
- 关于Weblogic的知识点
一.解决Weblogic域创建.启动.进入控制台慢问题 搭建Weblogic 11g和12c环境时发现,安装正常,以默认组件安装,但是创建域的时候特别慢,一般需要几分钟至10分钟,卡在“创建域安全信息 ...
- Linux-父进程wait回收子进程
1.wait工作原理 (1).子进程结束时,系统向其父进程发送SIGCHILD信号 (2).父进程调用wait函数后阻塞 (3).父进程被SIGCHILD信号唤醒然后去回收僵尸子进程 (4).父子进程 ...
- Myeclipse 10/2014 配置插件(svn、maven、properties、velocity)的方法
一.配置SVN详细图解 什么是SVN? 管理软件开发过程中的版本控制工具. 下面会以两种方式来介绍怎么安装svn,myeclipse安装SVN插件步骤,以myeclipse 2014为例,第一种是最常 ...
- Python笔记_第三篇_面向对象_3.重载(overloading)和重写(overriding)
1. 重载: overloading:就是将函数重新定义一遍. 1.1 __str__( )和__repr__( )的重载: 格式: __str__( ):在调用print打印对象时自动调用,是给用户 ...