In the end, you always need the string n + 1 to complete this task. The only thing that can be optimized is the time it takes to create these objects.
You can create a string representation as a char array and lazy (on demand) returning suffixes.
You can use Iterable and Iterator interfaces for this:
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++);
You can implement key functionality over a char array.
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++);
But IMHO is more complicated, and we get nothing.
The advantage of this solution is that you can work on the results and make a decision to terminate before creating all the prefixes.
source share