/** * RecursiveSubstringGenerator * * classe eseguibile capace di generare le sottostringhe di una stringa data. * La stringa e' passata come argomento nella riga di comando. * L'insieme delle sottostringhe e' visualizzato a standard output, dieci * sottostringhe per riga. * * @author Adriano Luchetta * @version 20-Nov-2004 */ public class RecursiveSubstringGenerator { public static void main(String[] args) { final int STRINGS_PER_RAW = 10; if (args.length < 1) { System.out.println("uso: $java RecursiveSubstringGenerator "); return; } String[] sub = recursivelyGenerateSubstrings(args[0]); for (int i = 0; i < sub.length; i++) { System.out.print(sub[i] + " "); if (((i + 1) % STRINGS_PER_RAW) == 0) System.out.println(); } } /** genera ricorsivamente le sottostringhe di una stringa data @param s la stringa di cui generare le sottostringhe @return l'array di stringhe contenente le sottostringhe della stringa s @throws java.lang.IllegalArgumentException se la stringa s non contiene almeno un carattere */ public static String[] recursivelyGenerateSubstrings(String s) { // gestione delle precondizioni if (s == null || s.length() < 1) throw new IllegalArgumentException(s + " stringa nulla o vuota"); // caso base if (s.length() < 2) return new String[] {s}; // passo ricorsivo String[] r = recursivelyGenerateSubstrings(s.substring(1)); // insieme unione degli insiemi di sottostringhe String[] union = new String[s.length() + r.length]; for (int i = 0; i < s.length(); i++) // sottoinsieme delle stringhe che union[i] = s.substring(0, i+1); // contengono il primo carattere int k = s.length(); for (int i = 0; i < r.length; i++) // sottoinsieme delle stringhe che union[k + i] = r[i]; // non contengono il primo carattere return union; } }