Вы не сильно улучшите временную сложность, потому что они используют итерации под капотом, но вы можете разбить фразу на пробелы и перебрать массив слов из вашей фразы.
Что-то вроде:
String[] arrayWords = phrase.toLowerCase().split(" ");
for(String word:arrayWords){
if(blacklistPhraseSet.contains(word)){
isProfane = true;
break;
}
}
Проблема этого кода в том, что если ваше слово не содержит составных слов, оно не будет соответствовать этим, тогда как ваш код, как я понимаю, будет. Слово "f ** k" в черном списке не будет совпадать с "f ** kwit" в моем коде, оно будет в вашем.