How about:
(defun foo ( l / a b )
(setq a (bar l)
b (bar (mapcar '(lambda ( x ) (vl-list->string (reverse (vl-string->list x)))) l))
)
(list (substr (car l) 1 a)
(mapcar '(lambda ( x ) (substr x (1+ a) (- (strlen x) a b))) l)
(substr (car l) (- (strlen (car l)) b -1))
)
)
(defun bar ( l )
(apply 'min (mapcar '(lambda ( s ) (vl-string-mismatch (car l) s)) (cdr l)))
)
_$ (foo '("Level 1 Floor Plan" "Level 2 Floor Plan" "Level 2b Floor Plan" "Level 3 Floor Plan"))
("Level " ("1" "2" "2b" "3") " Floor Plan")
If you want case-insensitivity, simply include the ignore-case argument for the vl-string-mismatch function.