Given a string S and a set of words D, find the longest word in D that is a subsequence of S
You know, if you want to improve performance, the first thing to do is get a high-level overview of what your code does to achieve its aim. Currently, you do this:


Iterate over all words in D.


Iterate over the whole string S trying to prove it a sub-sequence.



That's trivially proven to be an \$O(\#D * \#S)\$ algorithm.

You can do better, by using the proper data structure:


Build a prefix-tree from the words, noting the longest word which can be found from there.
Iterate over the string.


Continue if the current character doesn't fit.
Update the best found if it is a terminal node.
recurse with the sub-tree.



Regarding your code:


Your use of a class is completely unmotivated. There are no invariants to protect, as evidenced by you marking it all public, and you only create it to call one single function anyway. Just make it a free function. Ok, if you change the algorithm, you might want to break it up it into building the trie, using a pre-computed trie, and putting it all together.
auto would allow you to always have the proper type, without cluttering your code with long and obscure names. Read "Almost Always Auto".
I'm not sure why you use a std::tuple. Maybe for obfuscation? If so, I confirm you are on the right way.
Always define variables in the smallest scope possible, unless there are significant advantages (most likely in performance) for a slightly longer lifetime.
return 0; is implicit for main().