[Solved] Reverse String Without Affecting Special Characters

Problem Statement: You have given a string. There can have multiple special characters inside the string. Write a program to reverse the given string. The position of the special characters should not be changed.

Example:

Input: 'abc/defgh$ij'
Output: 'jih/gfedc$ba'

Algorithm:

Here is a simple algorithm to solve this problem to reverse string without affecting special characters

  • Convert given string into a list (or array) such that every character in the string will be one element in the list.
  • Set the two pointers at the beginning of the list (says i) and at the end of the list (says j)
  • repeat while i<j:
    • if list[i] is a special character, increment i by 1
    • else if list[j] is a special character, decrement j by 1
    • else (list[i] and list[j] are alphabets) swap list[i] and list[j], increment i by 1 , decrement j by 1

Python Program:

strSample='abc/defgh$ij'
 
#convert string into list
listSample=list(strSample)
 
i=0
j=len(listSample)-1
 
while i<j:
    if not listSample[i].isalpha():
        i+=1
    elif not listSample[j].isalpha():
        j-=1
    else:
        #swap the element in the list 
        #if both elements are alphabets
        listSample[i], listSample[j]=listSample[j], listSample[i]
        i+=1
        j-=1
 
#convert list into string 
#by concatinating each element in the list
strOut=''.join(listSample)
print(strOut)

Output:

jih/gfedc$ba

An isAlpha() is the character method that returns true if the character is an alphabet. Otherwise (if it is a special character), it returns false.

In Python, we can reverse the string with a single line of code. But, this is a special case where we don’t want to change the position of the special characters.

Similarly, you can solve this problem in C/C++ or Java.

This question was asked in the Oracle interview.

Complexity:

We are traversing each character in the string at once. In the worst case, the time complexity is O(n), where n is the size of the given string.

We can do the in-place swapping of the characters of the string. So, it does not require any extra space. (In the case of Python, it’s not possible to swap the characters inside the string. So, we are obligated to use the list. This causes extra memory space.)

Other Python Coding Questions for Practice:

This is the simple solution to reverse string without affecting special characters. Practice solving more of such coding questions to improve your programming skills.

Python Interview Questions eBook

Comments

  • abhishek
    April 1, 2020 at 12:30 pm

    Hi,

    How to do code for below one?

    def reverse_each_word(sentence):
      # TODO: Implement this function
      return
    def main():
      test_str =  "String; 2be reversed..."
      assert reverse_each_word(test_str) ==  "gnirtS; eb2 deserved..."
      return 0
    

    Sample Input:

    Input string = "String; 2be reversed..."
    Output: "gnirtS; eb2 deserved..."
    
    • Aniruddha Chaudhari
      April 2, 2020 at 8:08 am

      In this case, the words of the given string are reversed. Here is how you do this.

      1. Split the words from the strings
      2. Loop over all the words in the string
      3. Reverse each word and concatenate it to the output string.

      Let me know if it is not clear.

  • rahul
    April 12, 2020 at 4:26 pm

    yes not cleared

    def reverse_eachword(sentence):
     return " ".join([x[::-1] for x in sentence.split()]) 
    print(reverse_eachword("String; 2be reversed..."))
    

    but o/p is not coming as expected

    • Aniruddha Chaudhari
      April 13, 2020 at 8:17 am

      Rahul, the Program you have written is to reverse each individual word in the sentence.

      It returns.

      ;gnirtS eb2 ...desrever
  • Aashish
    May 18, 2020 at 2:11 am

    Hi Abhishek,

    below is code which work for you:

    str_smpl = 'String; 2be reversed...'
    lst = []
    for word in str_smpl.split(' '):
        letters = [c for c in word if c.isalpha()]
        for c in word:
            if c.isalpha():
                lst.append(letters.pop())
                continue
            else:
                lst.append(c)
        lst.append(' ')
    print("".join(lst))
    

    Output:

    gnirtS; 2eb deserved...
  • Santosh
    June 7, 2020 at 9:40 pm

    Hi,
    How do I include assert in the main() condition which must succeed upon error?

  • Dwarakanath
    September 21, 2020 at 9:44 pm
    str = list('abcdefghijklmnopqrstuvwxyz')
    user_input = input("enter the value -- ")
    print(user_input)
    list0 = list(user_input)
    list1 = list(user_input)[::-1]
    def reverse(user_input):
        for i in list1:
            if i not in str:
                list1.remove(i)
                list1.insert(list0.index(i),i)
        print("".join(list1))
    reverse(user_input)
    
    • Aniruddha Chaudhari
      September 22, 2020 at 4:42 pm

      Interesting. But, it will consume extra memory for strings and lists.

      • Dwarakanath
        September 23, 2020 at 1:41 pm

        Thank you for your response. Can you please guide in memory management and time complexity?

        • Aniruddha Chaudhari
          September 26, 2020 at 9:34 am

          In your example, you have created an extra list (list1) of leght n. So the space complexity has increased to O(n).
          As you looping over the list only once, the time complexity is O(n) which is very efficient.

Leave a Reply