Java para encontrar si una matriz es un subconjunto de otra
Tengo problemas para averiguar si una cantidad específica de números está en otra matriz. La primera matriz genera 10 números aleatorios y en la segunda matriz el usuario adivina 5 números. Estoy tratando de averiguar si el usuario adivinó alguna secuencia. bucles para averiguar si los números de entrada del usuario están en cualquiera de los números del 1 al 5 en la matriz de 10, si no, verificará los números del 2 al 6 y así sucesivamente. Por ejemplo, si el programa tiene los siguientes números ganadores: 23 56 67 06 43 22 59 24 90 66 y el usuario ingresó: 01 06 43 22 89. Sigo saliendo de los límites del índice. ¿Cómo puedo solucionar esto?
// to check if user guessed a sequence
boolean guessed = false;
int counter = 0;
int i , j = 0;
for (i = 4; i < numbers.length; i++) { // users numbers
for ( j = 4; j < lottery.length; j++) { // first 5 numbers from array
if ( lottery[i] == numbers[j]) {
break;
}
if ( j == i) {
guessed = true;
}
}
}
Respuestas
Parece que se String::indexOfdebería implementar un método similar al en esta tarea para las matrices que intentan encontrar un índice de una submatriz int indexOf(int[] search, int[] input).
Además, podría ser necesario buscar todos los posibles subarreglos del searchsubarreglo ( lottery). Por lo tanto, el método mencionado debe extenderse para buscar un subrango del searchargumento:int indexOf(int[] search, int[] input)
La implementación sencilla sería:
static int indexOf(int search[], int from, int to, int[] input) {
if (null == search || null == input || search.length > input.length) {
return -1;
}
for (int i = 0, n = input.length - (to - from); i <= n; i++) {
boolean found = true;
for (int j = from; found && j < to; j++) {
if (input[i + j - from] != search[j]) {
found = false;
}
}
if (found) {
return i;
}
}
return -1;
}
Los anchos y los índices apropiados from/ tode los subrangos de búsqueda se pueden generar de la siguiente manera (desde la longitud completa de lotteryhasta 2):
int[] numbers = {23, 56, 67, 06, 43, 22, 59, 24, 90, 66};
int[] lottery = {01, 06, 43, 22, 89};
for (int n = lottery.length; n > 1; n--) {
for (int m = 0; m <= lottery.length - n; m++) {
int ix = indexOf(lottery, m, m + n, numbers);
if (ix > -1) {
System.out.printf("Found subarray %s, width=%d from: %d to %d ",
Arrays.toString(Arrays.copyOfRange(lottery, m, m + n)), n, m, m + n - 1);
System.out.printf("at index: %d%n", ix);
}
}
}
Salida
Found subarray [6, 43, 22], width=3 from: 1 to 3 at index: 3
Found subarray [6, 43], width=2 from: 1 to 2 at index: 3
Found subarray [43, 22], width=2 from: 2 to 3 at index: 4
Una implementación más eficiente usaría el algoritmo Knuth-Morris-Pratt para evitar las comprobaciones recurrentes de los mismos valores en la matriz de entrada.