ho messo nomi lunghi ai metodi per migliorare la comprensione
ho usato due ricorsioni: una principale e una per contare le occorrenze.
codice:
// dato un array di stringe (a partire da un dato indice)
// conta il numero di stringhe di lunghezza data
private static int quanteStessaLunghezza(int lunghezza, String[] array, int indiceControllo) {
// passo base: se ho finito di scandire l'array ce ne sono 0 con la stessa lunghezza
if(indiceControllo == array.length) {
return 0;
/*
* passo ricorsivo:
* se la prima è della lunghezza data restituisce 1 + il numero di stringhe
* di lunghezza data nel resto dell'array.
* Altrimenti il numero di stringhe di lunghezza data nel resto dell'array
*/
} else {
return quanteStessaLunghezza(lunghezza, array, indiceControllo+1)+
(array[indiceControllo].length() == lunghezza?1:0);
}
}
private static boolean almenoKStringheUgualiRic(int k, String[] array, int indiceControllo) {
/*
* passo base:
* se k == 0 ritorna true
* se indiceControllo == array.length (finito l'array) ritorna false
*/
if(k == 0 || indiceControllo == array.length) {
return k == 0;
/*
* passo ricorsivo:
* prende la prima stringa e verifica se nel resto dell'array ce ne sono
* almeno k-1 della stessa lunghezza. Se ci sono ritorna true,
* altrimenti considera la stringa successiva...
*/
} else {
return quanteStessaLunghezza( array[indiceControllo].length(),
array,
indiceControllo+1) == k - 1
||
almenoKStringheUgualiRic(k, array, indiceControllo+1);
}
}
public static boolean almenoKStringheUguali(int k, String[] array) {
return almenoKStringheUgualiRic(k, array, 0);
}
public static void main(String[] args) {
String strs[] = {"a", "aa", "aaa", "aaaa", "aaa", "aa", "aa", "aa"};
System.out.println(almenoKStringheUguali(2, strs));
System.out.println(almenoKStringheUguali(3, strs));
System.out.println(almenoKStringheUguali(4, strs));
System.out.println(almenoKStringheUguali(5, strs));
System.out.println(almenoKStringheUguali(6, strs));
}