Open In App

In-place replace multiple occurrences of a pattern

Improve
Improve
Like Article
Like
Save
Share
Report

Given a string and a pattern, replace multiple occurrences of a pattern by character ‘X’. The conversion should be in-place and the solution should replace multiple consecutive (and non-overlapping) occurrences of a pattern by a single ‘X’.

String – GeeksForGeeks
Pattern – Geeks
Output: XforX
 
String – GeeksGeeks
Pattern – Geeks
Output: X

String – aaaa
Pattern – aa
Output: X

String – aaaaa
Pattern – aa
Output: Xa

The idea is to maintain two index i and j for in-place replacement. Index i always points to next character in the output string. Index j traverses the string and searches for one or more pattern match. If a match is found, we put character ‘X’ at index i and increment index i by 1 and index j by length of the pattern. Index i is increment only once if we find multiple consecutive occurrences of the pattern. If the pattern is not found, we copy current character at index j to index i and increment both i and j by 1. Since pattern length is always more than equal to 1 and replacement is only 1 character long, we would never overwrite unprocessed characters i.e j >= i is invariant.

Implementation:

C++




// C++ program to in-place replace multiple
// occurrences of a pattern by character ‘X’
#include <bits/stdc++.h>
using namespace std;
 
// returns true if pattern is prefix of str
bool compare(char* str, char* pattern)
{
    for (int i = 0; pattern[i]; i++)
        if (str[i] != pattern[i])
            return false;
    return true;
}
 
// Function to in-place replace multiple
// occurrences of a pattern by character ‘X’
void replacePattern(char* str, char* pattern)
{
    // If pattern is null or empty string,
    // nothing needs to be done
    if (pattern == NULL)
        return;
 
    int len = strlen(pattern);
    if (len == 0)
        return;
 
    int i = 0, j = 0;
    int count;
 
    // for each character
    while (str[j]) {
        count = 0;
 
        // compare str[j..j+len] with pattern
        while (compare(str + j, pattern)) {
            // increment j by length of pattern
            j = j + len;
            count++;
        }
 
        // If single or multiple occurrences of pattern
        // is found, replace it by character 'X'
        if (count > 0)
            str[i++] = 'X';
 
        // copy character at current position j
        // to position i and increment i and j
        if (str[j])
            str[i++] = str[j++];
    }
 
    // add a null character to terminate string
    str[i] = '\0';
}
 
// Driver code
int main()
{
    char str[] = "GeeksforGeeks";
    char pattern[] = "Geeks";
 
    replacePattern(str, pattern);
    cout << str;
 
    return 0;
}


Java




// Java equivalent
// Java program to in-place replace multiple
// occurrences of a pattern by character ‘X’
public class ReplaceOccurrences
{
 
  // returns true if pattern is prefix of str
  public static boolean compare(String str, String pattern)
  {
    for (int i = 0; i<pattern.length(); i++)
      if (str.charAt(i) != pattern.charAt(i))
        return false;
    return true;
  }
 
  // Function to in-place replace multiple
  // occurrences of a pattern by character ‘X’
  public static String replacePattern(String str, String pattern)
  {
    // If pattern is null or empty string,
    // nothing needs to be done
    if (pattern == "")
      return str;
 
    int len = pattern.length();
    if (len == 0)
      return str;
 
    int i = 0, j = 0;
    int count;
 
    // for each character
    while (j<str.length())
    {
      count = 0;
 
      // compare str[j..j+len] with pattern
      if (j + len <= str.length() && compare(str.substring(j,j+len), pattern))
      {
        // increment j by length of pattern
        j = j + len;
        count++;
      }
 
      // If single or multiple occurrences of pattern
      // is found, replace it by character 'X'
      if (count > 0)
      {
        String firstPart = str.substring(0,i);
        String lastPart = str.substring(i+1);
        str = firstPart + 'X' + lastPart;
        i++;
      }
 
      // copy character at current position j
      // to position i and increment i and j
      if (j<str.length())
      {
        String firstPart = str.substring(0,i);
        String lastPart = str.substring(i+1);
        str = firstPart + str.charAt(j) + lastPart;
        i++; j++;
      }
    }
 
    // add a null character to terminate string
    String firstPart = str.substring(0,i);
    str = firstPart;
    return str;
  }
 
  // Driver code
  public static void main(String[] args)
  {
    String str = "GeeksforGeeks";
    String pattern = "Geeks";
 
    str = replacePattern(str, pattern);
    System.out.println(str);
  }
}


Python3




# Python3 program to in-place replace multiple
# occurrences of a pattern by character ‘X’
 
# returns true if pattern is prefix of Str
def compare(Str, pattern):
 
    if(len(Str) != len(pattern)):
        return False
 
    for i in range(len(pattern)):
        if (Str[i] != pattern[i]):
            return False
         
    return True
 
# Function to in-place replace multiple
# occurrences of a pattern by character ‘X’
def replacePattern(Str,pattern):
 
    # If pattern is null or empty String,
    # nothing needs to be done
    if (pattern == ""):
        return
 
    Len = len(pattern)
 
    if (Len == 0):
        return
 
    i, j = 0, 0
 
    # for each character
    while (j < len(Str)):
 
        count = 0
 
        # compare Str[j..j+len] with pattern
        while (compare(Str[j:j+Len], pattern)):
            # increment j by length of pattern
            j = j + Len
            count += 1
 
        # If single or multiple occurrences of pattern
        # is found, replace it by character 'X'
        if (count > 0):
            Str = Str[0:i] + 'X' + Str[i+1:]
            i += 1
         
 
        # copy character at current position j
        # to position i and increment i and j
        if (j<len(Str)):
            Str = Str[0:i] + Str[j] + Str[i+1:]
            i += 1
            j += 1
 
    # add a null character to terminate String
    Str = Str[0:i]
    return Str
 
# Driver code
Str = "GeeksforGeeks"
pattern = "Geeks"
 
Str = replacePattern(Str, pattern)
print(Str)
 
# This code is contributed by shinjanpatra


C#




// C# program for the above approach
using System;
 
public class Program
{
   
  // returns true if pattern is prefix of str
  static bool Compare(string str, string pattern)
  {
    for (int i = 0; i < pattern.Length; i++)
      if (str[i] != pattern[i])
        return false;
    return true;
  }
 
  // Function to in-place replace multiple
  // occurrences of a pattern by character ‘X’
  static void ReplacePattern(char[] str, string pattern)
  {
 
    // If pattern is null or empty string,
    // nothing needs to be done
    if (pattern == null)
      return;
 
    int len = pattern.Length;
    if (len == 0)
      return;
 
    int i = 0, j = 0;
    int count;
 
    // for each character
    while (j < str.Length) {
      count = 0;
 
      // compare str[j..j+len] with pattern
      while (j + len <= str.Length && Compare(new string(str, j, len), pattern)) {
        // increment j by length of pattern
        j = j + len;
        count++;
      }
 
      // If single or multiple occurrences of pattern
      // is found, replace it by character 'X'
      if (count > 0)
        str[i++] = 'X';
 
      // copy character at current position j
      // to position i and increment i and j
      if (j < str.Length)
        str[i++] = str[j++];
    }
 
    // add a null character to terminate string
    str[i] = '\0';
  }
 
  // Driver code
  public static void Main()
  {
    char[] str = "GeeksforGeeks".ToCharArray();
    string pattern = "Geeks";
 
    ReplacePattern(str, pattern);
    Console.WriteLine(str);
  }
}
 
// This code is contributed by codebraxnzt


Javascript




<script>
 
// JavaScript program to in-place replace multiple
// occurrences of a pattern by character ‘X’
 
// returns true if pattern is prefix of str
function compare(str, pattern)
{
    for (let i = 0; i<pattern.length; i++)
        if (str[i] != pattern[i])
            return false;
    return true;
}
 
// Function to in-place replace multiple
// occurrences of a pattern by character ‘X’
function replacePattern(str,pattern)
{
    // If pattern is null or empty string,
    // nothing needs to be done
    if (pattern == "")
        return;
 
    let len = pattern.length;
    if (len == 0)
        return;
 
    let i = 0, j = 0;
    let count;
 
    // for each character
    while (j<str.length) {
 
        count = 0;
 
        // compare str[j..j+len] with pattern
        while (compare(str.substring(j,j+len), pattern)) {
            // increment j by length of pattern
            j = j + len;
            count++;
        }
 
        // If single or multiple occurrences of pattern
        // is found, replace it by character 'X'
        if (count > 0){
            str = str.substring(0,i) + 'X' + str.substring(i+1,)
            i++
        }
 
        // copy character at current position j
        // to position i and increment i and j
        if (j<str.length){
            str = str.substring(0,i) + str[j] + str.substring(i+1,)
            i++;j++
        }
    }
 
    // add a null character to terminate string
    str = str.substring(0,i);
    return str;
}
 
// Driver code
let str = "GeeksforGeeks";
let pattern = "Geeks";
 
str = replacePattern(str, pattern);
document.write(str,"</br>");
 
// This code is contributed by shinjanpatra
 
</script>


Output

XforX

Time complexity: O(n*m) where n is length of string and m is length of the pattern.
Auxiliary Space: O(1) 

Implementation using STL

The idea of this implementation is to use the STL in-built functions 
to search for pattern string in main string and then erasing it 
from the main string

C++




// C++ program to in-place replace multiple
// occurrences of a pattern by character ‘X’
#include <bits/stdc++.h>
using namespace std;
 
// Function to in-place replace multiple
// occurrences of a pattern by character ‘X’
void replacePattern(string str, string pattern)
{
 
    // making an iterator for string str
    string::iterator it = str.begin();
    // run this loop until iterator reaches end of string
    while (it != str.end()) {
        // searching the first index in string str where
        // the first occurrence of string pattern occurs
        it = search(str.begin(), str.end(), pattern.begin(), pattern.end());
        // checking if iterator is not pointing to end of the
        // string str
        if (it != str.end()) {
            // erasing the full pattern string from that iterator
            // position in string str
            str.erase(it, it + pattern.size());
            // inserting 'X' at that iterator position
            str.insert(it, 'X');
        }
    }
 
    // this loop removes consecutive 'X' in string s
    // Example: GeeksGeeksforGeeks was changed to 'XXforX'
    // running this loop will change it to 'XforX'
    for (int i = 0; i < str.size() - 1; i++) {
        if (str[i] == 'X' && str[i + 1] == 'X') {
            // removing 'X' at position i in string str
            str.erase(str.begin() + i);
            i--; // i-- because one character was deleted
            // so repositioning i
        }
    }
    cout << str;
}
 
// Driver code
int main()
{
    string str = "GeeksforGeeks";
    string pattern = "Geeks";
 
    replacePattern(str, pattern);
 
    return 0;
}


Java




/*package whatever //do not write package name here */
 
import java.io.*;
 
public class GFG {
    // Function to in-place replace multiple occurrences of a pattern by character ‘X’
    static void replacePattern(StringBuilder str, String pattern) {
        // run this loop until string str is empty
        while (str.length() > 0) {
            // searching the first index in string str where the first occurrence of string pattern occurs
            int index = str.indexOf(pattern);
             
            // checking if pattern is found in string str
            if (index >= 0) {
                // erasing the full pattern string from that index position in string str
                str.delete(index, index + pattern.length());
                 
                // inserting 'X' at that index position
                str.insert(index, "X");
            } else {
                // if pattern is not found in string str, exit loop
                break;
            }
        }
 
        // this loop removes consecutive 'X' in string s
        // Example: GeeksGeeksforGeeks was changed to 'XXforX'
        // running this loop will change it to 'XforX'
        for (int i = 0; i < str.length() - 1; i++) {
            if (str.charAt(i) == 'X' && str.charAt(i + 1) == 'X') {
                // removing 'X' at position i in string str
                str.deleteCharAt(i);
                i--; // i-- because one character was deleted so repositioning i
            }
        }
 
        System.out.println(str);
    }
 
    public static void main(String[] args) {
        StringBuilder str = new StringBuilder("GeeksforGeeks");
        String pattern = "Geeks";
 
        replacePattern(str, pattern);
    }
}


Python3




# Python program to in-place replace multiple
# occurrences of a pattern by character ‘X’
import re
 
# Function to in-place replace multiple
# occurrences of a pattern by character ‘X’
def replacePattern(str, pattern):
    # search for the pattern in the string
    while (re.search(pattern, str)):
        # replace the first occurrence of pattern with 'X'
        str = re.sub(pattern, 'X', str, 1)
 
    # remove consecutive 'X' in string s
    # Example: GeeksGeeksforGeeks was changed to 'XXforX'
    # running this loop will change it to 'XforX'
    i = 0
    while (i < len(str) - 1):
        if (str[i] == 'X' and str[i + 1] == 'X'):
            # removing 'X' at position i in string str
            str = str[:i] + str[i+1:]
        else:
            i += 1
     
    print(str)
 
# Driver code
if __name__ == "__main__":
    str = "GeeksforGeeks"
    pattern = "Geeks"
 
    replacePattern(str, pattern)
     
# Contributed by adityasha4x71


C#




// C# program to in-place replace multiple
// occurrences of a pattern by character ‘X’
 
using System;
using System.Linq;
 
class Gfg
{
    // Function to in-place replace multiple
    // occurrences of a pattern by character ‘X’
    static void replacePattern(ref string str, string pattern)
    {
        // run this loop until string str is empty
        while (str.Length > 0)
        {
            // searching the first index in string str where
            // the first occurrence of string pattern occurs
            int index = str.IndexOf(pattern);
             
            // checking if pattern is found in string str
            if (index >= 0)
            {
                // erasing the full pattern string from that index position in string str
                str = str.Remove(index, pattern.Length);
                 
                // inserting 'X' at that index position
                str = str.Insert(index, "X");
            }
            else
            {
                // if pattern is not found in string str, exit loop
                break;
            }
        }
 
        // this loop removes consecutive 'X' in string s
        // Example: GeeksGeeksforGeeks was changed to 'XXforX'
        // running this loop will change it to 'XforX'
        for (int i = 0; i < str.Length - 1; i++)
        {
            if (str[i] == 'X' && str[i + 1] == 'X')
            {
                // removing 'X' at position i in string str
                str = str.Remove(i, 1);
                i--; // i-- because one character was deleted
                // so repositioning i
            }
        }
 
        Console.WriteLine(str);
    }
 
    // Driver code
    static void Main(string[] args)
    {
        string str = "GeeksforGeeks";
        string pattern = "Geeks";
 
        replacePattern(ref str, pattern);
    }
}


Javascript




// Javascript code addition
 
function replacePattern(str, pattern) {
    while (str.search(pattern) !== -1) {
        // Replace the first occurrence of pattern with 'X'
        str = str.replace(pattern, 'X');
    }
 
    // Remove consecutive 'X' in string s
    // Example: GeeksGeeksforGeeks was changed to 'XXforX'
    // Running this loop will change it to 'XforX'
    let i = 0;
    while (i < str.length - 1) {
        if (str[i] === 'X' && str[i + 1] === 'X') {
            // Removing 'X' at position i in string str
            str = str.substring(0, i) + str.substring(i + 1);
        } else {
            i++;
        }
    }
 
    console.log(str);
}
 
const str = "GeeksforGeeks";
const pattern = /Geeks/g;
 
replacePattern(str, pattern);
 
// The code is contributed by Nidhi goel.


Output

XforX

Time Complexity: O(n*m)
Auxiliary Space: O(1)



Last Updated : 25 Apr, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads