; compare strings with one error (define (common eql? xs ys) (let loop ((xs xs) (ys ys) (zs (list))) (cond ((or (null? xs) (null? ys)) (reverse zs)) ((not (eql? (car xs) (car ys))) (reverse zs)) (else (loop (cdr xs) (cdr ys) (cons (car xs) zs)))))) (define (match1 str1 str2) (let* ((cs1 (string->list str1)) (cs1-len (length cs1)) (cs2 (string->list str2)) (cs2-len (length cs2)) (min-len (min cs1-len cs2-len)) (max-len (max cs1-len cs2-len))) (if (< 1 (- max-len min-len)) #f (let* ((prefix (common char=? cs1 cs2)) (suffix (reverse (common char=? (reverse cs1) (reverse cs2)))) (pref-len (length prefix)) (suff-len (length suffix))) (if (= (- max-len pref-len suff-len) 1) pref-len #f))))) (display (match1 "ABCDE" "BCDE")) (newline) (display (match1 "BCDE" "ABCDE")) (newline) (display (match1 "ABCD" "ABCDE")) (newline) (display (match1 "ABCDE" "ABDE")) (newline) (display (match1 "ABDE" "ACD")) (newline) (display (match1 "ABCDE" "ADCBE")) (newline) (display (match1 "ABCDE" "ABCDE")) (newline) (display (match1 "ABCDE" "ABC")) (newline)