public int lengthOfLastWord(String s) { s.replaceAll("\\s", ""); String[] splittedS = s.split("\\s+"); if(splittedS.length == 1 && splittedS[0].equals("")) return 0; return splittedS[splittedS.length - 1].length(); } Lo probé con la cadena " " y devuelve que la longitud de splittedS es 0.
Cuando recorté la cadena, ¿obtuve " " -> "" , así que cuando dividí esto, debería tener una matriz de longitud con el primer elemento siendo "" ?
Las cadenas Java son inmutables, por lo que debe almacenar la referencia a la cadena devuelta después del reemplazo porque se ha devuelto una nueva cadena. Has escrito,
s.replaceAll("\\s", ""); Pero escribe, s = s.replaceAll("\\s", ""); en lugar de arriba.
Dondequiera que realice operaciones en String, mantenga la nueva referencia moviéndose más.
La llamada a replaceAll no tiene efecto, pero dado que se divide en \\s+ , el método de split funciona exactamente igual: termina con una matriz vacía.
Recuerde que la split de un argumento es lo mismo que la división de dos argumentos con cero pasado para el segundo parámetro:
String[] splittedS = s.split("\\s+", 0); // ^^^Esto significa que el patrón de expresión regular se aplica hasta que no haya más cambios, y luego las cadenas vacías finales se eliminan de la matriz.
Este último punto es lo que hace que su matriz esté vacía: la aplicación del patrón \\s+ produce una matriz [ "" ] , con una sola cadena vacía. Esta cadena se considera final por split , por lo que se elimina del resultado.
Este resultado no va a cambiar incluso si arregla la llamada para replaceAll el camino que sugieren otras respuestas.
Necesitas reasignar la variable
s=s.replaceAll(...)