Hola,
No dudo que funcione, pero quizas hay otro algoritmo mas facil simplemente mirando el problema desde otro enfoque. Sabemos el tamaño de la cadena; sabemos cual es el ultimo caracter; recorremos la cadena desde el final hasta el comienzo hasta que encontremos un caracter que no sea igual al ultimo caracter, contando los que son iguales; sabiendo cuantos son iguales, hacemos la sustitucion. Y asi de cabeza me sale este codigo:
Código PHP:
$texto="holaaaaaaaaaaaaaaaaaaaaa";
$longitud_cadena=strlen($texto);
$ultimo_caracter=$texto{$longitud_cadena - 1}; // -1 porque el primer caracter es el indice 0
$caracteres_repetidos=0;
for ($i=$longitud_cadena - 1;$i>=0;$i--) {
if ($texto{$i}!=$ultimo_caracter) break; // salimos del bucle
$caracteres_repetidos++; // sumamos 1 al numero de caracteres repetidos
} // fin for
$texto_final=substr_replace($texto,"b",$longitud_cadena-$caracteres_repetidos,$caracteres_repetidos);
echo $texto_final;
He hecho un par de pruebas y parece que funciona.
Simplemente otra opcion de algoritmo.
Saludos.
PD: Esto es lo grande de la programacion. Pregunta a 10 programadores por un programa, y obtendras 21 codigos totalmente validos y que funcionan.