How the Word Finder Matches Letters to Words
The word finder takes a handful of letters and returns every word on its list that those letters can spell. This guide explains the mechanism: how your letters are reduced to a tally, what "can spell" means once copies of a letter matter, what a blank actually does, why results arrive in the order they do, and where the candidate words come from. Every count, tally, message and deficit below was computed at build time by the engine that runs in your browser; the list-provenance figures are quoted from the engine's own header; and the matching examples use a small illustrative list written for this page, not the list the tool ships with.
From typed letters to a tally
The first thing the engine does is stop treating your input as a string. Order carries no
information here — "retains" and "stainer" are the same rack — so the parser reduces whatever
you typed to a count per letter: an array of 26 slots, one for each letter a to z, holding
how many copies of that letter you have. Along the way it lowercases everything, discards whitespace,
and pulls out every ? as a blank. The rack is then summarized as a normalized string,
the letters sorted alphabetically with the blanks moved to the end. The engine reports that string
with every result, so racks differing only in case or order are identical to it.
| Typed | Normalized rack | Tiles | Blanks |
|---|---|---|---|
retains | aeinrst | 7 | 0 |
RETAINS | aeinrst | 7 | 0 |
ret ains | aeinrst | 7 | 0 |
?retains | aeinrst? | 8 | 1 |
banana? | aaabnn? | 7 | 1 |
LETTER?? | eelrtt?? | 8 | 2 |
Two consequences follow. Case never matters, because the tally is taken after lowercasing. And a blank is not a letter: it is kept as a separate count and occupies none of the 26 letter slots, which is why the limits are stated in tiles — 2 to 20 in all, at most 2 of them blanks.
What the parser rejects, and why
The parser understands only a to z and ?, because the list it will search holds
only lowercase a-to-z words. Anything else is refused with a message that names the problem
rather than silently dropped. Each message below is the engine's own text for the input in the
first column; whitespace on its own yields "Enter letters to search with.".
| Typed | Problem | Message |
|---|---|---|
abc1 | contains a digit | Digits are not letters — enter letters a–z only (use ? for a blank). |
café | contains a letter outside a–z | Only letters a–z and ? blanks are allowed — remove: é |
a-b! | contains punctuation | Only letters a–z and ? blanks are allowed — remove: - ! |
q | too few tiles | Enter at least 2 letters. |
abcdefghijklmnopqrstu | too many tiles | Enter at most 20 letters (you have 21). |
abc??? | too many blanks | At most 2 blanks (?) are allowed. |
An accented letter such as é is rejected, not folded to e, because this parser performs no Unicode normalization — unlike the site's letter counter, which normalizes to NFC before counting (see letters and Unicode normalization). Folding café to cafe would be a guess at what you meant; naming the character it cannot use is the honest behavior. Apostrophes and hyphens are parts of a word to the word counter, as what counts as a word explains, but stray characters here, because no entry in an a-to-z list can contain one.
Multiset containment, letter by letter
Once the rack is tallied, each candidate word gets the same treatment: the engine counts how many copies of each letter the word needs. A word is makeable when, for every one of the 26 letters, it needs no more copies than the rack supplies. That rule is called multiset containment — "multiset" because copies matter, "containment" because the word's tally has to fit inside the rack's.
Take the rack RETAINS, which tallies as a×1, e×1, i×1, n×1, r×1, s×1, t×1. The word retina needs a×1, e×1, i×1, n×1, r×1, t×1: every letter it uses is available, so it fits, with the s left over. Tartan needs a×2, n×1, r×1, t×2, and two requirements fail — a (needs 2, the rack has 1) and t (needs 2, the rack has 1). The engine adds the shortfalls into a total deficit of 2, and with no blanks to absorb it the word is rejected. Zebra, needing a×1, b×1, e×1, r×1, z×1, fails the same way: b (needs 1, the rack has 0) and z (needs 1, the rack has 0), again a deficit of 2. A letter the rack lacks entirely and a second copy it lacks are the same kind of shortage.
The check never arranges letters; it sees nothing of a word beyond its tally, so anagrams of one another either both fit a rack or neither does.
What a blank does
A blank covers exactly one missing copy of any letter. In the arithmetic above, that means a word matches when its total deficit is no larger than the number of blanks in the rack. One blank leaves tartan as far from fitting RETAINS as before, because a single tile cannot be both the second t and the second a; its deficit of 2 needs two blanks, and with two it appears. The same two blanks would cover the z and b of zebra, or the second n and second a of naan, whose deficit against RETAINS is also 2. The engine never assigns a blank to a position; it only checks whether the shortage fits the allowance.
Worked examples against an illustrative list
The examples below run the real matching function against a list of 39 words written
for this page, so that every result fits on screen. It is not the list the tool ships with, and nothing
here claims which of these words appear in that list; the point is to watch the rules act on inputs
you can verify by hand. The list is: a, an, ant, art, at, ban, banana, bandana, in, inert, naan, nab, nastier, net, rain, rat, restrain, restraint, retain, retina, retinas, retrain, stain, stainer, stair, star, strain, strainer, tartan, tartans, tea, ten, terrains, tin, train, trainee, trainees, trains, zebra.
RETAINS, no blanks
From the rack aeinrst, 23 of the 39 words match, including 3 that use all 7 tiles:
- 7 letters — nastier, retinas, stainer
- 6 letters — retain, retina, strain, trains
- 5 letters — inert, stain, stair, train
- 4 letters — rain, star
- 3 letters — ant, art, net, rat, tea, ten, tin
- 2 letters — an, at, in
Every word on the list that is absent failed for one of three reasons: it is longer than the rack (restrain, terrains), it needs a second copy of a letter the rack holds once (retrain, trainee, naan), or it needs a letter the rack lacks altogether (ban, zebra). The one-letter entry a is missing for a fourth reason — the default minimum length of 2, covered below.
RETAINS with one blank, then two
Adding a blank makes the rack aeinrst?, 8 tiles, and the total rises from 23 to 31. Every newcomer — restrain, strainer, terrains, trainees, retrain, trainee, ban, nab — has a deficit of exactly one against the original 7 letters, and 4 of them are 8 letters long, a length the bare rack could not reach. A second blank (aeinrst??) lifts the total to 36, admitting restraint, tartans, tartan, zebra, naan: each of those was held back by a deficit of two.
- 9 letters — restraint
- 8 letters — restrain, strainer, terrains, trainees
- 7 letters — nastier, retinas, retrain, stainer, tartans, trainee
- 6 letters — retain, retina, strain, tartan, trains
- 5 letters — inert, stain, stair, train, zebra
- 4 letters — naan, rain, star
- 3 letters — ant, art, ban, nab, net, rat, tea, ten, tin
- 2 letters — an, at, in
BANANA, a rack heavy with copies
A rack with repeated letters shows the copies rule from the other side. BANANA tallies as a×3, b×1, n×2: 3 distinct letters, 6 tiles. Against the illustrative list it matches just 5 words — banana, naan, ban, nab, an — and naan is among them because the rack can supply a×2, n×2. One blank raises the total to 9: the newcomers are bandana, ant, at, in, and the longest, bandana, needs a×3, b×1, d×1, n×2, of which only d (needs 1, the rack has 0) is short.
Length first, then letters
Before any tally is compared, the engine discards every candidate whose length falls outside the window: shorter than the minimum length, or longer than the rack. The second test is decisive on its own — a word longer than the rack cannot fit no matter how many blanks it holds, because the blanks are already counted in the rack total. On a list the size of the shipped one, this step removes most entries before the letter-by-letter check runs.
Restraint shows the order of operations. At 9 letters it is filtered out against the 8-tile rack aeinrst? without its letters being examined, though its deficit against them is only 2 — r (needs 2, the rack has 1) and t (needs 2, the rack has 1). Against the 9-tile rack aeinrst?? it passes the length test, then matches because two blanks cover that deficit, which is why it heads the two-blank list above.
Minimum length is the one filter you control from the tool page. Its default of 2 hides one-letter entries; raising it hides short words. Against the illustrative list, RETAINS with a minimum of 5 letters returns 11 words rather than 23 — simply the longer groups of the earlier result.
Ordering and the result cap
Results are grouped by length, longest group first, and sorted alphabetically within each group. The sort compares code points, which for lowercase a-to-z words is plain dictionary order — no capitals, accents, or hyphens complicate it — so the same rack against the same list always produces the same output.
Because a large rack can match a great many words, the engine keeps at most 5,000. When more match, it retains the first 5,000 in display order and raises a flag saying the list was trimmed; the total and per-length counts are still computed over every match and stay exact. With a cap of 5 on RETAINS against the illustrative list, the engine reports 23 matches, the same total as before, but lists only nastier, retinas, stainer, retain, retina — the longest group in full and the next cut short — and marks the result truncated.
The list the shipped tool searches
The engine has no dictionary built in. The list is passed to it as an argument on every search, which is why the examples above could use a 39-word stand-in. Any entry containing a character outside a to z is skipped rather than matched, so a stray line can never produce a false result.
What the tool page loads is ENABLE, a public-domain list of 172,820 lowercase entries. Our copy was retrieved on 2026-07-18 and ships with the site as a plain text file, one word per line. The list predates the 2006 tournament additions, so two-letter words such as qi and za are absent. For any particular game, that game's own reference is the authority, not this list; the engine can only report what it was given.
Where the search runs
The matching function is pure: it reads no files and makes no requests. The tool page loads the list into your browser once, and every search after that is local JavaScript against that copy, so the letters you type never leave your device. The site's counting tools work the same way; the guides index covers their rules.
Frequently asked questions
My rack has the letter — why is a word with that letter doubled missing?
Because copies count. The engine compares tallies, not letter sets: tartan needs a×2, n×1, r×1, t×2, and against the rack RETAINS (a×1, e×1, i×1, n×1, r×1, s×1, t×1) it is short by a (needs 2, the rack has 1) and t (needs 2, the rack has 1), a total deficit of 2. Without blanks, any deficit above zero rejects the word.
How many blanks can I use, and what does each one do?
Up to 2, typed as ?. Each blank covers exactly one missing copy of any letter, so a word matches when its total deficit is no larger than the number of blanks. On this page's illustrative list, RETAINS matches 23 words, RETAINS? matches 31, and RETAINS?? matches 36.
Why are QI and ZA missing from the results?
The shipped list is ENABLE, a public-domain snapshot of 172,820 lowercase entries retrieved on 2026-07-18. It predates the 2006 tournament additions, so those two-letter words are not in it. The matching engine has no opinion about which words are valid — it reports whatever the list it is given contains.
Why does the tool say it listed only some of the matching words?
Results are capped at 5,000 words, kept in display order — longest first, alphabetical within a length — and a flag reports when the cap trimmed the list. The total and the per-length counts stay exact regardless. With a demonstration cap of 5 on RETAINS against the illustrative list, the engine still reports 23 matches while listing only nastier, retinas, stainer, retain, retina.
Can I type uppercase letters, spaces, or accented letters?
Uppercase and whitespace are fine: RETAINS, retains and "ret ains" all normalize to the rack aeinrst. Accented letters are rejected rather than folded — typing café produces the message "Only letters a–z and ? blanks are allowed — remove: é" — because the list contains only a–z and a silent conversion would be a guess.
Why do one-letter words never appear?
The default minimum word length is 2, and racks themselves must hold between 2 and 20 tiles. Raising the minimum on the tool page hides short words: against the illustrative list, RETAINS with a minimum of 5 letters returns 11 words instead of 23.
Matching happens locally in your browser — nothing you type is transmitted or stored. Every result in this guide was computed at build time by the same engine the word finder runs, against the illustrative list stated above. See the methodology page.