For simplicity first assume that the letters of the replaced string are distinct.
'abcde' -> 'cde'
We can iterate through the string and apply these rules:
- If the next character is equal to the next character on the pointer, increase the last pointer.
- if the last pointer is equal to the length of the replaced string (in this case 
5) replace the string, remove the last pointer and continue from the start of the replaced string. 
 
- Else if the next character is equal to the first character of the replaced string (in this case 
a), create a new pointer. 
- Else clear all pointers
 
Let's go through an example with the string 'xabxababcde'
v
xabxababcde
x: clear all pointers. pointers:
 v
xabxababcde
a: create a new pointer. pointers: 1
  v
xabxababcde
b: increase the last pointer. pointers: 2
   v
xabxababcde
x: clear all pointers. pointers:
    v
xabxababcde
a: create a new pointer. pointers: 1
     v
xabxababcde
b: increase the last pointer. pointers: 2
      v
xabxababcde
a: create a new pointer. pointers: 2, 1
       v
xabxababcde
b: increase the last pointer. pointers: 2, 2
        v
xabxababcde
c: increase the last pointer. pointers: 2, 3
         v
xabxababcde
d: increase the last pointer. pointers: 2, 4
          v
xabxababcde
e: increase the last pointer. pointers: 2, 5
At this point, we replace abcde with cde and remove the last pointer
      v
xabxabcde
c: increase the last pointer. pointers: 3
       v
xabxabcde
d: increase the last pointer. pointers: 4
        v
xabxabcde
e: increase the last pointer. pointers: 5
And replace again
xabxcde
And we are done! This algorithm works for distinct elements in the replaced string. To upgrade our algorithm, we need to change the third rule to
- move the pointer to LPS[pointer] and check that location.
 
LPS array is an array that its nth element contains the length of the longest proper prefix that is also a suffix for the replaced string 1 to n. For clarity, you can check this link