public static ArrayList<Integer> KMP(String cadena, String 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.charAt(pos) != patron.charAt(i - 1)) {
				pos = fallas[pos];
			}

			fallas[i] = pos + 1;
		}
		System.out.println(Arrays.toString(fallas));
		// cp = pocision cadena, pp = pocision patron
		for (int cp = 0, pp = 0; cp < cadena.length(); cp++) {
			while (pp != -1
					&& (pp == patron.length() || patron.charAt(pp) != cadena.charAt(cp))) {
				pp = fallas[pp];
			}
			pp++;
			if (pp == patron.length()) {
				coincidencias.add(cp + 1 - patron.length());
			}
		}

		return coincidencias;
	}