Другое решение, написанное в более функциональном стиле - обратите внимание, что я не выделяю новые строки при каждом вызове рекурсивного метода (только операция split
в начале выделяет новые строки).Я также принял предложение Роберта сначала преобразовать исходную проблему в рекурсию по массивам, это упростит задачу:
public static String longestWord(String s) {
return longestWord(s.split("\\s+"), 0, 0);
}
public static String longestWord(String[] words, int currentIdx, int longestIdx) {
if (currentIdx == words.length)
return words[longestIdx];
return longestWord(words, currentIdx + 1,
words[currentIdx].length() > words[longestIdx].length() ? currentIdx : longestIdx);
}
Хитрость в приведенном выше решении заключается в том, что моя рекурсия опережает индексы 1006 * массива строк, а не поверх самих строк.Вот почему я избегаю создавать новые строки при каждом вызове.Нет substring
, copyOfRange
, arraycopy
, new String()
или аналогичные операции необходимы для получения более элегантного решения.
РЕДАКТИРОВАТЬ:
Я упростилприведенный выше код немного, чтобы было легче понять.Что касается метода split
, это стандартная строковая операция, взгляните на документацию .
public static String longestWord(String s) {
return longestWord(s.split(" "), 0, 0);
}
public static String longestWord(String[] words, int currentIdx, int longestIdx) {
if (currentIdx == words.length)
return words[longestIdx];
int idx; // temporarily stores the index of the current longest word
if (words[currentIdx].length() > words[longestIdx].length())
idx = currentIdx;
else
idx = longestIdx;
return longestWord(words, currentIdx + 1, idx);
}