LeetCode-022-括号生成
括号生成
题目描述:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例说明请见LeetCode官网。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl...
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:穷举法
通过递归的方式获取所有可能的组合,然后判断每一种组合是否是有效的括号组合,如果是,添加到结果集中,最后返回符合的结果集合。
解法二:回溯法
也是通过递归的方式,但是可以根据已经出现过的左右括号的个数来判断下一个字符可以是左括号还是右括号,这样最后递归得到的都是有效的括号组合,效率较高。
import java.util.ArrayList;
import java.util.List;
public class LeetCode_022 {
/**
* 暴力破解法
*
* @param n
* @return
*/
public static List<String> generateParenthesis(int n) {
List<String> result = new ArrayList<>();
generateAllPossibleResults(new char[2 * n], 0, result);
return result;
}
/**
* 递归方法:2*n 的字符数组,每一个字符都有2种可能,直到字符数组被填满,校验是否符合
*
* @param current
* @param pos
* @param result
*/
public static void generateAllPossibleResults(char[] current, int pos, List<String> result) {
if (pos == current.length) {
// 当字符数组被填充满时,校验是否符合
if (valid(current)) {
result.add(new String(current));
}
} else {
// 递归
current[pos] = '(';
generateAllPossibleResults(current, pos + 1, result);
current[pos] = ')';
generateAllPossibleResults(current, pos + 1, result);
}
}
/**
* 判断是否符合条件
*
* @param current
* @return
*/
public static boolean valid(char[] current) {
int balance = 0;
for (char c : current) {
if (c == '(') {
++balance;
} else {
--balance;
}
if (balance < 0) {
return false;
}
}
return balance == 0;
}
static List<String> res = new ArrayList<>();
/**
* 方法二:回溯法
*
* @param n
* @return
*/
public static List<String> generateParenthesis2(int n) {
if (n <= 0) {
return res;
}
getParenthesis("", n, n);
return res;
}
private static void getParenthesis(String str, int left, int right) {
if (left == 0 && right == 0) {
res.add(str);
return;
}
if (left == right) {
//剩余左右括号数相等,下一个只能用左括号
getParenthesis(str + "(", left - 1, right);
} else if (left < right) {
//剩余左括号小于右括号,下一个可以用左括号也可以用右括号
if (left > 0) {
getParenthesis(str + "(", left - 1, right);
}
getParenthesis(str + ")", left, right - 1);
}
}
public static void main(String[] args) {
System.out.println("=====暴力破解法=====");
List<String> strings = generateParenthesis(4);
for (String string : strings) {
System.out.println(string);
}
System.out.println("=====回溯法=====");
List<String> strings1 = generateParenthesis2(4);
for (String s : strings1) {
System.out.println(s);
}
}
}
【每日寄语】 一万个美丽的未来,抵不上一个温暖的现在。
LeetCodet题解
技术学习
推荐阅读
牛客网高频算法题系列-BM19-寻找峰值
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于假设 nums[-1] = nums...
雄狮虎豹阅读 358
PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。
王中阳Go赞 8阅读 1.4k评论 2
与RabbitMQ有关的一些知识
工作中用过一段时间的Kafka,不过主要还是RabbitMQ用的多一些。今天主要来讲讲与RabbitMQ相关的一些知识。一些基本概念,以及实际使用场景及一些注意事项。
lpe234赞 8阅读 1.8k
万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...
JavaGuide赞 4阅读 377
Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...
王中阳Go赞 5阅读 2.1k评论 2
Redis 发布订阅模式:原理拆解并实现一个消息队列
“65 哥,如果你交了个漂亮小姐姐做女朋友,你会通过什么方式将这个消息广而告之给你的微信好友?““那不得拍点女朋友的美照 + 亲密照弄一个九宫格图文消息在朋友圈发布大肆宣传,暴击单身狗。”像这种 65 哥通过朋...
码哥字节赞 6阅读 1.3k
NB的Github项目,看到最后一个我惊呆了!
最近看到不少好玩的、实用的 Github 项目,就来给大家推荐一把。中国制霸生成器最近在朋友圈非常火的一个小网站,可以在线标记 居住、短居、游玩、出差、路过 标记后可生成图片进行社区分享,标记过的信息会记录...
艾小仙赞 5阅读 1.6k评论 1
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。