Buenas rubens lo miro...
Vale el ejercicio está correcto, hace lo que se pide y entendiste el substring perfectamente.
Te hago dos apreciaciones a nivel lógico que yo veo, a simple vista.
Primera: palabra.substring(0+i,1+i) sumar 0 entiendo que lo haces para diferenciar del +1 y verlo tu más claro pero a nivel lógico todo lo que suma 0 es igual al otro valor, es decir 0 + i = i
palabra.substring(i,1+i)
Segunda: esta ya es algo más personal, no importante, el propio int i = 0 ya es un contador inicializado a 0, una linea antes tu creas int contador = 0;
dentro del bucle lo vas aumentando una unidad, fijate que la variable i hace lo mismo exactamente. Supongo que pusiste el contador porque la i empezaba en 0 y tu querias que una variable se iniciara a 1 sin afectar al substring, solución que yo haría;
for (int i = 0; i < palabra.length(); i++){
// contador = contador+1; <--- eliminar esta linea
System.out.println("Letra " + (i+1) + " = " +palabra.substring(i,i+1));
} /*añadir 1 a la i para ahorrarte un nuevo contador y no afectar al substring*/
La estructura y idea estupenda, y al final lo que te comento es un simple contador que no afecta demasiado, pero te doy la alternativa como idea.
Un saludo