Finding the indices of multiple words in a string
Map&lt;String, Stack&lt;Integer&gt;&gt; dest = findWordsInString(words, phrase);

I don't see the need at all for a Stack here. And not a Map either.

Let's say that you would want to find the third occourance of the word, and then randomly the first, and the fifth, and the second... Then you would want to store the indices in a List, not a Stack.

And why deal with multiple words at the same time? The way that your method is written, it makes more sense to search for all occurances of one word at a time.

As for the very important for loop, while it is totally alright to write it like that, I would personally prefer a while loop with something like this: (there is a bunch of variations for how you could do this)

int loc = phrase.indexOf(word);
while (loc != -1) {
   locations.add(loc);
   loc = phrase.indexOf(word, loc + 1);
}


It makes it easier to read the code, in my opinion.