; first unrepeated character in a string
(define (f str)
(let ((len (string-length str)) (x (make-vector 256 -1)))
(do ((i 0 (+ i 1))) ((= i len))
(let ((c (char->integer (string-ref str i))))
(cond ((= (vector-ref x c) -1) (vector-set! x c i))
((< -1 (vector-ref x c)) (vector-set! x c -2)))))
(let loop ((c 0) (i (+ len 1)))
(cond ((= c 256)
(if (< i len)
(values i (string-ref str i))
(error 'f "no unrepeated character")))
((and (< -1 (vector-ref x c)) (< (vector-ref x c) i))
(loop (+ c 1) (vector-ref x c)))
(else (loop (+ c 1) i))))))
(call-with-values
(lambda () (f "aaab"))
(lambda (idx chr)
(display idx) (display " ")
(display chr) (newline)))
(call-with-values
(lambda () (f "aaabbbcddd"))
(lambda (idx chr)
(display idx) (display " ")
(display chr) (newline)))
(call-with-values
(lambda () (f "aaaebbbcddd"))
(lambda (idx chr)
(display idx) (display " ")
(display chr) (newline)))
(call-with-values
(lambda () (f "aabbcc"))
(lambda (idx chr)
(display idx) (display " ")
(display chr) (newline)))