我遇到了从给定的一对括号返回有效括号字符串的问题。例如。如果 n=2,我必须返回一个有效序列的列表,即 ["()()", "(())"]。如果问题不是很清楚,不用担心,因为我的疑问比较笼统。
我使用动态编程来寻找解决方案。 list(list) 存储任何对 k 的有效序列列表。列表(lists) 存储来自0<=k<=n 的所有此类列表。我采用了两种方法,改动很小。 解决 1 -
public List<String> generateParenthesis(int n) {
List<List<String>> lists = new ArrayList<>();
lists.add(Collections.singletonList(""));
for (int i=1; i<=n; i++) {
List<String> list = new ArrayList<>();
for (int j=0; j<i; j++) {
for (String first : lists.get(j)) {
for (String second : lists.get(i-1-j))
list.add("(" + first + ")" +second);
}
}
lists.add(list);
}
return lists.get(lists.size()-1);
Soln 2-
public List<String> generateParenthesis(int n) {
List<List<String>> lists = new ArrayList<>();
lists.add(Collections.singletonList(""));
for (int i=1; i<=n; i++) {
List<String> list = new LinkedList<>();
for (int j=0; j<i; j++) {
for (String first : lists.get(j)) {
for (String second : lists.get(i-1-j))
list.add("(" + first + ")" +second);
}
}
lists.add(list);
}
return lists.get(lists.size()-1);
它们之间唯一的区别是 list(list) 在第一种情况下是 ArrayList,在第二种情况下是 LinkedList。根据他们在 oracle 站点上的 API 描述,对于这两种实现,添加操作需要恒定的时间,并且与 LinkedList 实现相比,ArrayList 的常量因子较低。我希望我的第一个解决方案更快,但实际上它是第二个。
PS - 我在 leetcode 上尝试了这个问题,所以他们有一个 1<=n<=8 的示例测试用例列表。
谁能解释一下原因?