# generate-parentheses.lisp -rw-r--r-- 889 bytes View raw
                                                                                
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
(defun make-empty-vector (size)
  (make-array size :fill-pointer size :adjustable t))

(defun vector-join (vector)
  (format nil "~{~a~^~}" (coerce vector 'list)))

(defun generate-parentheses (number-of-parentheses)
  (let ((stack (make-empty-vector 0))
	(result (make-empty-vector 0)))
    (labels ((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))
    result))