mi sembra logico, se questa è la stringa
abcd
esegue questi passi:
abcd
dbcd
dccd

dopodiché quando effettua gli ultimi 2 passaggi la stringa è già modificata...

per far funzionare correttamente il tutto dovresti usare una stringa d'appoggio