1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
(defun make-empty-vector ()
(make-array 0 :fill-pointer 0 :adjustable t))
(defun vector-join (vector)
(format nil
(concatenate 'string "~{~a~^~}")
(coerce vector 'list)))
(defun generate-parentheses (number-of-parentheses)
(let ((stack (make-empty-vector))
(result (make-empty-vector)))
(defun backtrack (open-parentheses closed-parentheses)
(when (= open-parentheses
closed-parentheses
number-of-parentheses)
(vector-push-extend (vector-join stack) result)
(return-from backtrack))
(when (< open-parentheses number-of-parentheses)
(vector-push-extend "(" stack)
(backtrack (1+ open-parentheses) closed-parentheses)
(vector-pop stack))
(when (< closed-parentheses open-parentheses)
(vector-push-extend ")" stack)
(backtrack open-parentheses (1+ closed-parentheses))
(vector-pop stack)))
(backtrack 0 0)
(return-from generate-parentheses result)))
(generate-parentheses 3)