В качестве начала вы можете узнать, является ли строка s1 поворотом строки s2 с помощью одного вызова метода contains (), например:
public boolean isRotation(String s1, String s2){
String s2twice = s2+s2;
return s2twice.contains(s1);
}
А именно, если s1 является «вращением»и s2 это "otationr", concat дает вам "otationrotationr", который действительно содержит s1.
Теперь, даже если мы предположим, что это линейно или близко к нему (что, например, невозможно при использовании Рабина-Карпа), у вас все равно останется O (n ^ 2) парных сравнений, которые могутбыть слишком много.
То, что вы могли бы сделать, это создать хеш-таблицу, где отсортированное слово является ключом, а список публикации содержит все слова из вашего списка, которые, если отсортированы, дают ключ (т.е. ключ («bca») и ключ («cab») оба должны возвращать «abc»):
private Map<String, List<String>> index;
/* ... */
public void buildIndex(String[] words){
for(String word : words){
String sortedWord = sortWord(word);
if(!index.containsKey(sortedWord)){
index.put(sortedWord, new ArrayList<String>());
}
index.get(sortedWord).add(word);
}
}
CAVEAT: Хеш-таблица будет содержать для каждого ключа все слова, которые имеют абсолютно одинаковые буквы, встречающиеся втакое же количество раз (не только повороты, т. е. «abba» и «baba» будут иметь одинаковый ключ, но isRotation («abba», «baba») вернет false).
Но как только вы построите этот индекс, вы можете значительно сократить количество пар, которые вам нужно учитывать: если вы хотите, чтобы все повороты для «bca» вам просто нужно отсортировать («bca»), посмотрите еговверх в хеш-таблице и проверьте (если хотите, используя метод isRotation выше), являются ли слова в списке публикаций результатом поворота или нет.