; two string exercises
; remove duplicate characters from a string
(define (rem-dup-char str)
(let ((seen (make-vector 256 #f)))
(let loop ((cs (string->list str)) (zs (list)))
(if (null? cs) (list->string (reverse zs))
(let ((i (char->integer (car cs))))
(if (vector-ref seen i) (loop (cdr cs) zs)
(begin (vector-set! seen i #t)
(loop (cdr cs) (cons (car cs) zs)))))))))
(display (rem-dup-char "aaabbb")) (newline)
(display (rem-dup-char "abcbd")) (newline)
; squash multiple spaces into a single space
(define (squash-space str)
(if (string=? str "") str
(let loop ((cs (cdr (string->list str)))
(zs (list (string-ref str 0))))
(if (null? cs) (list->string (reverse zs))
(if (and (char=? (car cs) #\space)
(char=? (car zs) #\space))
(loop (cdr cs) zs)
(loop (cdr cs) (cons (car cs) zs)))))))
(display (squash-space "a b")) (newline)
(display (squash-space "a b")) (newline)