public static ArrayList<Integer> KMP(int[] cadena, int[] patron) {

		int[] fallas = new int[patron.length + 1];

		ArrayList<Integer> coincidencias = new ArrayList<Integer>();
		int pos;
		Arrays.fill(fallas, -1);
		// funcion de fallas
		for (int i = 1; i <= patron.length; i++) {
			pos = fallas[i - 1];

			while (pos != -1 && patron[pos] != patron[i - 1]) {
				pos = fallas[pos];
			}

			fallas[i] = pos + 1;
		}

		// printArrayInt(cadena);
		// printArrayInt(patron);
		// printArrayInt(fallas);
		// cp = pocision cadena, pp = pocision patron
		for (int cp = 0, pp = 0; cp < cadena.length; cp++) {

			while (pp != -1
					&& (pp == patron.length || patron[pp] != cadena[cp])) {
				pp = fallas[pp];

			}

			pp++;

			if (pp == patron.length) {
				coincidencias.add(cp + 1 - patron.length);
				cont++;

			}
		}

		return coincidencias;
	}