A simple solution would be to pre - compute the words and build a trie tree having digits in the nodes and each leaf node would have a link to a linked list /array(or some other data structure) of strings that can be formed using those digits.
At any given point , for example the user has typed 4663 -> go to all children of the last node(having the digit 3 in the example) that are not null, reach the leaf nodes through the various paths and print the valid words.
Note : Since the number of digits=10 only , the size of the trie tree would be limited. A ternary search tree(TST) could also be used in place of the trie tree but here , but since there are only 10 digits , there would not be much significant advantages of using a TST I guess.
EDIT - As pointed out by user1168577 , using a heuristic like frequency of usage, words can be shown in that order.