Replace two substrings (of a string) with each other

Given 3 strings S, A and B. The task is to replace every sub-string of S equal to A with B and every sub-string of S equal to B with A. It is possible that two or more sub-strings matching A or B overlap. To avoid confusion about this situation, you should find the leftmost sub-string that matches A or B, replace it, and then continue with the rest of the string.
For example, when matching A = “aa” with S = “aaa”, A[0, 1] will be given preference over A[1, 2].
Note that A and B will have the same length and A != B.

Examples:

Input: S = “aab”, A = “aa”, B = “bb”
Output: bbb
We match the first two characters with A and replacing it with B we get bbb.
Then we continue the algorithm starting at index 3 and we don’t find any more matches.



Input: S = “aabbaabb”, A = “aa”, B = “bb”
Output: bbaabbaa
We replace all the occurrences of “aa” with “bb” and “bb” with “aa”, so the resultant string is “bbaabbaa”.

Approach: Go through every possible sub-string from S of length len(A). if any sub-string matches A or B then update the string as required and print the updated string in the end.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include<bits/stdc++.h>
using namespace std;
  
// Function to return the resultant string
string updateString(string S, 
                    string A, string B)
{
  
    int l = A.length();
  
    // Iterate through all positions i
    for (int i = 0; i + l <= S.length(); i++)
    {
  
        // Current sub-string of 
        // length = len(A) = len(B)
        string curr = S.substr(i, i + l);
  
        // If current sub-string gets 
        // equal to A or B
        if (curr == A) 
        {
  
            // Update S after replacing A
            string new_string = "";
            new_string += S.substr(0, i) + B + 
                          S.substr(i + l, S.length());
            S = new_string;
            i += l - 1;
        }
        else
        {
  
            // Update S after replacing B
            string new_string = "";
            new_string += S.substr(0, i) + A + 
                          S.substr(i + l, S.length());
            S = new_string;
            i += l - 1;
        }
    }
  
    // Return the updated string
    return S;
}
  
// Driver code
int main()
{
    string S = "aab";
    string A = "aa";
    string B = "bb";
  
    cout << (updateString(S, A, B)) << endl;
}
  
// This code is contributed by
// Surendra_Gangwar

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
class GFG {
  
    // Function to return the resultant string
    static String updateString(String S, String A, String B)
    {
  
        int l = A.length();
  
        // Iterate through all positions i
        for (int i = 0; i + l <= S.length(); i++) {
  
            // Current sub-string of length = len(A) = len(B)
            String curr = S.substring(i, i + l);
  
            // If current sub-string gets equal to A or B
            if (curr.equals(A)) {
  
                // Update S after replacing A
                String new_string
                    = S.substring(0, i)
                      + B + S.substring(i + l, S.length());
                S = new_string;
                i += l - 1;
            }
            else {
  
                // Update S after replacing B
                String new_string
                    = S.substring(0, i)
                      + A + S.substring(i + l, S.length());
                S = new_string;
                i += l - 1;
            }
        }
  
        // Return the updated string
        return S;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        String S = "aab";
        String A = "aa";
        String B = "bb";
  
        System.out.println(updateString(S, A, B));
    }
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach 
  
# Function to return the resultant string 
def updateString(S, A, B): 
      
    l = len(A) 
      
    # Iterate through all positions i 
    i = 0
    while i + l <= len(S): 
  
        # Current sub-string of 
        # length = len(A) = len(B) 
        curr = S[i:i+l] 
  
        # If current sub-string gets
        # equal to A or B 
        if curr == A: 
  
            # Update S after replacing A 
            new_string = S[0:i] + B + S[i + l:len(S)] 
            S = new_string 
            i += l - 1
              
        else:
  
            # Update S after replacing B 
            new_string = S[0:i] + A + S[i + l:len(S)] 
            S = new_string 
            i += l - 1
          
        i += 1
      
    # Return the updated string 
    return
  
# Driver code 
if __name__ == "__main__":
      
    S = "aab"
    A = "aa"
    B = "bb"
  
    print(updateString(S, A, B)) 
      
# This code is contributed by Rituraj Jain

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach 
using System;
  
class GFG 
  
    // Function to return the resultant string 
    static string updateString(string S, string A, string B) 
    
        int l = A.Length; 
  
        // Iterate through all positions i 
        for (int i = 0; i + l <= S.Length; i++) 
        
  
            // Current sub-string of length = len(A) = len(B) 
            string curr = S.Substring(i, l); 
  
            // If current sub-string gets equal to A or B 
            if (curr.Equals(A))
            
  
                // Update S after replacing A 
                string new_string = S.Substring(0, i) +
                                 B + S.Substring(i + l); 
                S = new_string; 
                i += l - 1; 
            
            else 
            
  
                // Update S after replacing B 
                string new_string = S.Substring(0, i) +
                                A + S.Substring(i + l); 
                S = new_string; 
                i += l - 1; 
            
        
  
        // Return the updated string 
        return S; 
    
  
    // Driver code 
    public static void Main() 
    
        string S = "aab"
        string A = "aa"
        string B = "bb"
        Console.WriteLine(updateString(S, A, B)); 
    
  
// This code is contributed by Ryuga

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP implementation of the approach
// Function to return the resultant string
function updateString($S, $A, $B)
{
  
    $l = strlen($A);
  
    // Iterate through all positions i
    for ($i = 0; $i + $l <= strlen($S); $i++) 
    {
  
        // Current sub-string of length = len(A) = len(B)
        $curr = substr($S, $i, $i + $l);
  
        // If current sub-string gets equal to A or B
        if (strcmp($curr, $A) == 0)
        {
  
            // Update S after replacing A
            $new_string = substr($S, 0, $i) . $B .
                        substr($S, $i + $l, strlen($S));
            $S = $new_string;
            $i += $l - 1;
        }
        else 
        {
  
            // Update S after replacing B
            $new_string = substr($S, 0, $i) . $A
                        substr($S, $i + $l, strlen($S));
            $S = $new_string;
            $i += $l - 1;
        }
    }
  
    // Return the updated string
    return $S;
}
  
// Driver code
$S = "aab";
$A = "aa";
$B = "bb";
  
echo(updateString($S, $A, $B));
  
// This code is contributed by Code_Mech.

chevron_right


Output:

bbb


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.