这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战
明天就是七夕节了,祝各位都能和心爱的人长长久久!
前2个有个之前中签的可转债上市了,赚了500,虽然钱很少,但是50%的涨幅已经挺多的了,这种弯腰捡铜板的事情,每天早上看盘的时候操作一下就好,也算是投资理财的第一步。我是以中证500这样的宽基指数做基底,然后根据自己对市场的认知买了一些个股,从效果看,我对市场还一无所知。不过理财这件事,学费总是要交的,现在钱不多的时候多经历一些牛熊,未来看来也是好事。
回到程序猿的职业,继续刷leetcode,今天是第22题。
题目
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
思路
前几天做了1题判断括号是否合法,今天反过来了,求合法的括号。
任何一个合法的括号对,都可以看做是 (in)out,其中in的长度是inLen,in可以使用长度为inLen的所有合法的括号情况组合,inLen确定后,out的outLen也是确定的,outLen = n - 1 - inLen,此时out可以是长度为 outLen的所有合法的括号情况组合;因为inLen的长度可以为0~n-1,所以外层再加1个inLen长度的循环。
这题是类似DP的,定义长度为n的长度合法括号情况集合为f(n),f(n)会依赖f(0)~f(n-1),对于每个n,我们可以用一个Set来记录所有合法的情况; 不过n大了之后,其实结果膨胀会很厉害,好在题目限制了 n < 8。
用f(3)来举个例子,就包含如下4中情况
Java版本代码
class Solution {
public List<String> generateParenthesis(int n) {
// 小标为n即为 n对括号
List<Set<String>> ansList = new ArrayList<>();
// 为后续处理方便,给n=0的情况
Set<String> zeroSet = new HashSet<>();
zeroSet.add("");
ansList.add(zeroSet);
for (int i = 1; i <= n; i++) {
Set<String> set = new HashSet<>();
for (int inLen = 0; inLen < i; inLen++) {
for (String in : ansList.get(inLen)) {
for (String out : ansList.get(i - 1 - inLen)) {
StringBuilder item = new StringBuilder();
item.append("(");
item.append(in);
item.append(")");
item.append(out);
set.add(item.toString());
}
}
}
ansList.add(set);
}
return new ArrayList<>(ansList.get(n));
}
}