LeetCode0020

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

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 注意空字符串可被认为是有效字符串。
/**
* @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('{[]}'));

LeetCode0022

给出 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的更多相关文章

  1. Leetcode(10)正则表达式匹配

    Leetcode(10)正则表达式匹配 [题目表述]: 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或 ...

  2. leetcode problem 10 Regular Expression Matching(动态规划)

    Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...

  3. 【一天一道LeetCode】#10. Regular Expression Matching

    一天一道LeetCode系列 (一)题目 Implement regular expression matching with support for '.' and '*'. '.' Matches ...

  4. LeetCode(10):正则表达式匹配

    Hard! 题目描述: 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整 ...

  5. 【LeetCode】10.Regular Expression Matching(dp)

    [题意] 给两个字符串s和p,判断s是否能用p进行匹配. [题解] dp[i][j]表示s的前i个是否能被p的前j个匹配. 首先可以分成3大类情况,我们先从简单的看起: (1)s[i - 1] = p ...

  6. 【leetcode】10.Regular Expression Matching

    题目描述: Implement regular expression matching with support for '.' and '*'. '.' Matches any single cha ...

  7. 《LeetBook》leetcode题解(10): Regular Expression Matching——DP解决正则匹配

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  8. leetcode笔记10 Intersection of Two Arrays(求交集)

    问题描述: Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, ...

  9. LeetCode第[10]题(Java):Regular Expression Matching

    题目:匹配正则表达式 题目难度:hard 题目内容:Implement regular expression matching with support for '.' and '*'. '.' Ma ...

  10. LeetCode(10) Regular Expression Matching

    题目 Implement regular expression matching with support for '.' and '*'. '.' Matches any single charac ...

随机推荐

  1. ZJNU 2353 - UNO

    大模拟,但是题目好像有些地方表述不清 根据UNO在初中曾被别人虐了很久很久的经历 猜测出了原本的题意 本题中的+2虽然有颜色,但是也可以当作原UNO游戏中的+4黑牌 即在某人出了+2后,可以出不同颜色 ...

  2. MySQL--SQL分类

    SQL语句主要可以划分为以下3个类别: DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段.数据库.表.列.索引等数据库对象. 常用的语句关键字 ...

  3. usr/sbin/inetd

    root 4 0.0 1344 1204? S 17:09 0:10 /usr/sbin/inetd 运行 Internet 超级 服务器,它负责监听 Internet sockets 上的连接,并调 ...

  4. CENTOS YUM更新源

    网络yum源和制作本地光盘yum源 配置CENTOS YUM更新源 yum安装rpm包安装后本地不清除的方法 sed -i 's#keepcache=0#keepcache=1#g' /etc/yum ...

  5. UML-SSD-为什么要画SSD?

    需求文本看着过于抽象,采用SSD一目了然. 在设计软件之前,分析人员会关注系统会发生那些事件? 1.基本上,软件系统要对以下3种事件进行响应: 1).来自于参与者(人或计算机)的外部事件 2).时间事 ...

  6. Linux学习(二) --- 常用命令

    [TOC] 一.常用命令 1.目录 cd切换 cd 路径 切换到指定路径 cd .. 上一级 mkdir:创建目录 mkdir 目录名 pwd:查看 2.查看 ll命令:查询目录内容 ll 查看当前( ...

  7. sybase连接失败 JZ006: Caught IOException: java.net.ConnectException处理方式

    windows系统下的处理办法: 1.查找端口为5000的进程的pid: 在cmd窗口中输入 netstat -ano 我这里是2324. 打开任务管理器,找到pid是2324的进程,结束进程. 打开 ...

  8. Python上楼梯

    假设一段楼梯共n(n>1)个台阶,小朋友一步最多能上3个台阶,那么小朋友上这段楼梯一共有多少种方法. (小朋友真的累,我选择电梯) 大体思路用到了递归,假如说楼梯有12阶,那么11阶时有只有一种 ...

  9. Java连接MySQL Warning: Establishing SSL connection without server's identity verification is not recommended

    1. 数据库 1.1 创建表 在当前数据库students中,创建数据表student: mysql> create table student( ),#学生ID ),#学生姓名 -> a ...

  10. memcached redis 本质区别是功能多少

    功能: 1.memcached 数据类型比较单一,数据淘汰策略单一,功能简单 2.redis 数据类型比较全面, 数据淘汰策略比较多,功能较强 有持久化能力,可以持久存储少量数据(数据量不会大于本机内 ...