【Java】力扣 - 刷题笔记 - 面试题 08.09
【Java】力扣 - 刷题笔记 - 面试题 08.09
每日一道题,提升一点点
题目介绍
面试题 08.09. 括号
括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。
说明:解集不能包含重复的子集。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解题思路
- 1.题目分析
我们可以先把所有可能全部加入到list中去,然后把不符合规则的元素遍历去掉(倒着来,不然好像有问题)
class Solution {
// 定义一个成员变量
private List<String> list = new ArrayList<>();
public List<String> generateParenthesis(int n) {
getElement("(",2*n - 1);
for (int i = list.size() - 1; i >= 0 ; i--) {
if (!compliance(list.get(i))){
list.remove(i);
}
}
return list;
}
// 判断元素是否满足要求
public boolean compliance(String str) {
int sum = 0;
char[] cs = str.toCharArray();
for (int i = 0; i < cs.length; i++) {
if (cs[i] == '(') {
sum += 1;
} else {
sum -= 1;
}
if (sum < 0) {
return false;
}
}
return sum == 0;
}
// 把所有的可能都加到list中
public void getElement(String str, int n) {
if (n > 0){
getElement(str+"(",n-1);
getElement(str+")",n-1);
} else {
list.add(str);
}
}
}
- 2.提交结果
- 3.结果反思
嗨呀,真滴难受,随着做题的难度的递增,发现做题的速度越来越慢,而且结果也不尽人意,遇到瓶颈了,仔细想一想,应该是数据结构忘的差不多了,如果要继续做下去的话,应该需要把以前学的数据结构的知识捡起来重新复习一遍的(算法基础),但是我今后的发展方向应该是JavaWeb方向,不确定是否需要把数据结构捡起来,所以暂时把刷题缓一缓,先把Java复习完,之后再决定要不要学习算法吧,任重道远,加油!