The answer given is 38, but consider all words with an m. Each of the other letters can be one of i, p, or s for \(3\cdot3 = 9\) words. There are three possible positions for m, giving \(3\cdot9 = 27\) words containing an m.
There are \(3! = 6\) words containing each of the letters i, p, and s.
For each word containing a pair of is, the remaining letter can be p or s, and the letter can appear in one of three positions, for 6 words containing two is. Words containing a pair of ps or a pair of ss have the same count, giving \(3\cdot6 = 18\) words containing letter pairs.
Finally, there are two words containing three identical letters? giving \(27 + 6 + 18 + 2 = 53\) distinct three-letter words.
As a check, here’s two Scheme functions computing the same value:
guile> (define (clear bag char)
; Return a copy of bag with an instance of char removed.
(let loop ((pre '()) (c (car bag)) (post (cdr bag)))
(if (char=? char c)
(append pre post)
(let ((pre' (cons c pre)))
(if (null? post)
(append pre' post)
(loop pre' (car post) (cdr post)))))))
guile> (define (mis)
; Return a set containing all three-letter combinations
; from the word "mississippi".
(let ((word '(#\m #\i #\s #\s #\i #\s #\s #\i #\p #\p #\i))
(triplets (make-hash-table 101)))
(for-each
(lambda (c1)
(let ((word' (clear word c1)))
(for-each
(lambda (c2)
(for-each
(lambda (c3)
(hash-set!
triplets (list->string (list c1 c2 c3)) 1))
(clear word' c2)))
word')))
word)
(hash-fold (lambda (k v s) (cons k s)) '() triplets)))
guile> (length (mis))
53
guile> (sort (mis) string<)
("iii" "iim" "iip" "iis" "imi" "imp" "ims" "ipi" "ipm" "ipp"
"ips" "isi" "ism" "isp" "iss" "mii" "mip" "mis" "mpi" "mpp"
"mps" "msi" "msp" "mss" "pii" "pim" "pip" "pis" "pmi" "pmp"
"pms" "ppi" "ppm" "pps" "psi" "psm" "psp" "pss" "sii" "sim"
"sip" "sis" "smi" "smp" "sms" "spi" "spm" "spp" "sps" "ssi"
"ssm" "ssp" "sss")
guile>