最后,您总是需要 n + 1 个字符串来完成此任务。唯一可以优化的是创建这些对象的时间。
您可以将字符串表示形式创建为 char 数组,然后惰性(按需)返回后缀。
您可以使用 Iterable 和 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
}
}
}
您可以通过 char 数组实现关键功能。
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() {
}
}
但恕我直言,更复杂,我们一无所获。
此解决方案的优点是您可以处理结果并决定在创建所有前缀之前停止。