这是Cracking the Coding Interview(第5版)中的问题9.6
实现一个算法来打印 n 对括号的所有有效组合
示例
输入:3
输出:"((()))、(()())、(())()、()(())、( )()()"
这是我实现的算法(在 Java 中)
private static Set<String> getAllComb(int n) {
Set<String> allPoss = new HashSet<String>();
if(n>0) {
if(n==1) {
allPoss.add("()");
} else {
Set<String> before = getAllComb(n-1);
for(String phrase: before) {
int length = phrase.length();
for(int start = length - 2; start>=0; start--) {
if(phrase.charAt(start) == '(') {
String phraseToConsider = phrase.substring(0, start+1) + "()" +
phrase.substring(start + 1);
if(!allPoss.contains(phraseToConsider)){
allPoss.add(phraseToConsider);
}
}
}
String phraseToConsider = "()" + phrase.substring(0);
if(!allPoss.contains(phraseToConsider)){
allPoss.add(phraseToConsider);
}
}
}
}
return allPoss;
}
这会产生正确的输出。我知道面试官(至少在亚马逊)喜欢问你解决方案的时间和空间复杂性。对于时间复杂度,我能够证明该算法在O(n)中运行,具有递归关系。我在分析空间复杂度时遇到了麻烦。我这是一个递归解决方案,所以它至少应该是O(n)但是在每次递归调用时,我也会生成一个以 n 为界的集合。由于 n 次递归调用,总空间是O(n)还是因为每个递归调用 n 的边界 n 的设置大小而为O(n 2 ) ?