Personally I'd probably go with an actual message system, where there can be x number of listeners, so if you for example press an arrow key, not only would your player receive the key press, but also your UI, etc. Each can then handle how they want to react to these messages (see
Tank's excellent article).
Getting back the issue at hand, this would be rather easily solvable with some special listener class(es). As an example you'd have a combo of ABBAB, no the class would listen to the A and B key press events. Then it could save the inputs and use a clock to make sure the inputs are "fresh". If it detects that ABBAB was pressed within a certain amount of time, it could issue the special combo message, which would be received by the player, etc.
The same thing works easily with holding some keys.
How exactly you'd shape the classes is also important, but depends on your needs and exact use case.