What are you waiting for? (A mahjong solver)
Python, 312 281 bytes

def W(S):H=lambda C,n=0,t=1:sum([m&lt;C[0]and H([c-s for c in C][:l]+C[l:],n+1,u)for m,s,l,u in(2,3,1,t),(t,2,1,4),(4-5*all(C[:3]),1,3,t)])|H(C[1:],n,t)if C[2:]and max(C)&lt;5else n&gt;4;T=[i+s for s in"mps"for i in"12345678900"];return" ".join(t for t in T if("1"&lt;t)*H(map((S+t).count,T)))


W takes a string as input and returns a string as output.

The small number of tiles (27) makes it fast enough to test if each of them completes the hand.
The problem becomes to check if a hand is valid.
The function uses a simple backtracking algorithm that considers all possible choices of sets and checks if any of them adds up to a complete hand.

Hands are represented as tile histograms, i.e. a list of tile counts (for all the tiles, not only the ones present in the hand.) This makes it easy to both check if we have a certain number of a certain tile, and if we have a sequence of adjacent tiles (padding between tiles of different suits prevent multi-suit sequences.)