В конце вам всегда требуется строка n + 1 для выполнения этой задачи. Единственное, что можно оптимизировать, - это время создания этих объектов.
Вы можете создать строковое представление в виде массива символов и ленивый (по запросу) возврат суффиксов.
Вы можете использовать интерфейсы итерации и Iterator, чтобы сделать это:
public class StringSufixies implements Iterable<String> {
private final String input;
public StringSufixies(String input) {
this.input = input;
}
@Override
public Iterator<String> iterator() {
return new SuffixStringIterator(input);
}
private static class SuffixStringIterator implements Iterator<String> {
private final String input;
private final int size;
private int suffixId;
private SuffixStringIterator(String input) {
this.input = input;
this.size = input.length();
this.suffixId = 1;
}
@Override
public boolean hasNext() {
return suffixId <= size;
}
@Override
public String next() {
return input.substring(0, suffixId++); //At this point we create new String
}
@Override
public void remove() {
//Add throw or other impl
}
}
}
Вы могли бы реализовать ключевые функции над массивом символов.
private static class SuffixCharIterator implements Iterator<String> {
private final char[] charSequence;
private final int size;
private int suffixId = 0;
private SuffixCharIterator(char[] charSequence) {
this.charSequence = charSequence;
this.size = charSequence.length;
}
@Override
public boolean hasNext() {
return suffixId <= size;
}
@Override
public String next() {
return new String(charSequence, 0, suffixId++); //At this point we create a new String
}
@Override
public void remove() {
}
}
Но ИМХО сложнее, и мы ничего не получаем.
Преимущество этого решения в том, что вы можете работать над результатами и решать, чтобы остановить, прежде чем все префиксы создаются.
Использование версии StringBuilder не улучшит производительность подстроки. Это почти такая же функция в любом случае. (На самом деле, в старых версиях Java, использующих StringBuilder, на самом деле может быть немного медленнее, не считая накладных расходов на создание самого объекта StringBuilder.) –
У первого фрагмента есть «линейное время и линейное пространство». И второй фрагмент имеет «квадратичное время и квадратичное пространство» –