Cómo reemplazar una substring de una string

Dadas tres strings S , S1 y S2 que constan de N , M y K caracteres respectivamente, la tarea es modificar la string S reemplazando todas las substrings S1 con la string S2 en la string S .

Ejemplos:

Entrada: S = “abababa”, S1 = “aba”, S2 = “a”
Salida: aba
Explicación:
Cambie las substrings S[0, 2] y S[4, 6](= S1) a la string S2(= “a”) modifica la string S a “aba”. Por lo tanto, escriba «aba».

Entrada: S = «geeksforgeeks», S1 = «eek», S2 = «ok»
Salida: goksforgoks

Enfoque ingenuo: el enfoque más simple para resolver el problema dado es atravesar la string S y cuando cualquier string S1 se encuentre como una substring en la string S , reemplácela por S2 . Siga los pasos a continuación para resolver este problema:

  • Inicialice una string y almacene la string resultante después de reemplazar todas las ocurrencias de la substring S1 a S2 en la string S .
  • Iterar sobre los caracteres de la string S usando la variable i y realizar los siguientes pasos:
    • Si la substring de prefijo de la string S es igual a S1 del índice i , agregue la string S2 en la string ans .
    • De lo contrario, agregue el carácter actual a la string ans .
  • Después de completar los pasos anteriores, imprima la string como resultado.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
  
#include <bits/stdc++.h>
using namespace std;
  
// Function to replace all the occurrences
// of the substring S1 to S2 in string S
void modifyString(string& s, string& s1,
                  string& s2)
{
    // Stores the resultant string
    string ans = "";
  
    // Traverse the string s
    for (int i = 0; i < s.length(); i++) {
  
        int k = 0;
  
        // If the first character of
        // string s1 matches with the
        // current character in string s
        if (s[i] == s1[k]
            && i + s1.length()
                   <= s.length()) {
  
            int j;
  
            // If the complete string
            // matches or not
            for (j = i; j < i + s1.length(); j++) {
  
                if (s[j] != s1[k]) {
                    break;
                }
                else {
                    k = k + 1;
                }
            }
  
            // If complete string matches
            // then replace it with the
            // string s2
            if (j == i + s1.length()) {
                ans.append(s2);
                i = j - 1;
            }
  
            // Otherwise
            else {
                ans.push_back(s[i]);
            }
        }
  
        // Otherwise
        else {
            ans.push_back(s[i]);
        }
    }
  
    // Print the resultant string
    cout << ans;
}
  
// Driver Code
int main()
{
    string S = "geeksforgeeks";
    string S1 = "eek";
    string S2 = "ok";
    modifyString(S, S1, S2);
  
    return 0;
}

Java

// Java program for the above approach
import java.util.*;
  
class GFG {
  
  // Function to replace all the occurrences
  // of the subString S1 to S2 in String S
  static void modifyString(String s, String s1, String s2)
  {
    // Stores the resultant String
    String ans = "";
  
    // Traverse the String s
    for (int i = 0; i < s.length(); i++) {
  
      int k = 0;
  
      // If the first character of
      // String s1 matches with the
      // current character in String s
      if (s.charAt(i) == s1.charAt(k)
          && i + s1.length() <= s.length()) {
  
        int j;
  
        // If the complete String
        // matches or not
        for (j = i; j < i + s1.length(); j++) {
  
          if (s.charAt(j) != s1.charAt(k)) {
            break;
          }
          else {
            k = k + 1;
          }
        }
  
        // If complete String matches
        // then replace it with the
        // String s2
        if (j == i + s1.length()) {
          ans += (s2);
          i = j - 1;
        }
  
        // Otherwise
        else {
          ans += (s.charAt(i));
        }
      }
  
      // Otherwise
      else {
        ans += (s.charAt(i));
      }
    }
  
    // Print the resultant String
    System.out.print(ans);
  }
  
  // Driver Code
  public static void main(String[] args)
  {
    String S = "geeksforgeeks";
    String S1 = "eek";
    String S2 = "ok";
    modifyString(S, S1, S2);
  }
}
  
// This code is contributed by gauravrajput1

C#

// C# program for the above approach
using System;
  
public class GFG {
  
  // Function to replace all the occurrences
  // of the subString S1 to S2 in String S
  static void modifyString(String s, String s1, String s2)
  {
      
    // Stores the resultant String
    String ans = "";
  
    // Traverse the String s
    for (int i = 0; i < s.Length; i++) {
  
      int k = 0;
  
      // If the first character of
      // String s1 matches with the
      // current character in String s
      if (s[i] == s1[k]
          && i + s1.Length <= s.Length) {
  
        int j;
  
        // If the complete String
        // matches or not
        for (j = i; j < i + s1.Length; j++) {
  
          if (s[j] != s1[k]) {
            break;
          }
          else {
            k = k + 1;
          }
        }
  
        // If complete String matches
        // then replace it with the
        // String s2
        if (j == i + s1.Length) {
          ans += (s2);
          i = j - 1;
        }
  
        // Otherwise
        else {
          ans += (s[i]);
        }
      }
  
      // Otherwise
      else {
        ans += (s[i]);
      }
    }
  
    // Print the resultant String
    Console.Write(ans);
  }
  
  // Driver Code
  public static void Main(String[] args)
  {
    String S = "geeksforgeeks";
    String S1 = "eek";
    String S2 = "ok";
    modifyString(S, S1, S2);
  }
}
  
// This code is contributed by gauravrajput1 

Javascript

<script>
// Javascript program for the above approach
  
// Function to replace all the occurrences
// of the sublet S1 to S2 in let S
function modifylet(s, s1,
                  s2)
{
    // Stores the resultant let
    let ans = "";
  
    // Traverse the let s
    for (let i = 0; i < s.length; i++) {
  
        let k = 0;
  
        // If the first character of
        // let s1 matches with the
        // current character in let s
        if (s[i] == s1[k]
            && i + s1.length
                   <= s.length) {
  
            let j;
  
            // If the complete let
            // matches or not
            for (j = i; j < i + s1.length; j++) {
  
                if (s[j] != s1[k]) {
                    break;
                }
                else {
                    k = k + 1;
                }
            }
  
            // If complete let matches
            // then replace it with the
            // let s2
            if (j == i + s1.length) {
                ans = ans + s2;
                i = j - 1;
            }
  
            // Otherwise
            else {
                ans = ans + s[i];
            }
        }
  
        // Otherwise
        else {
            ans = ans + s[i];
        }
    }
  
    // Print the resultant let
    document.write(ans);
}
  
// Driver Code
    let S = "geeksforgeeks";
    let S1 = "eek";
    let S2 = "ok";
    modifylet(S, S1, S2);
  
// This code is contributed by splevel62.
</script>
Producción: 

goksforgoks

 

Complejidad temporal: O(N*M)
Espacio auxiliar: O(N)

Enfoque eficiente: el enfoque anterior también se puede optimizar creando la array de prefijos y sufijos adecuada más larga para la string S1 y luego realizar el algoritmo KMP para encontrar las ocurrencias de la string S1 en la string S . Siga los pasos a continuación para resolver este problema:

  • Cree un vector , digamos lps[] que almacene el prefijo y el sufijo adecuados más largos para cada carácter y complete este vector usando el algoritmo KMP para la string S1 .
  • Inicialice dos variables, digamos, i y j como 0 para almacenar la posición del carácter actual en s y s1 respectivamente.
  • Inicialice un vector encontrado para almacenar todos los índices iniciales a partir de los cuales aparece la string S1 en S .
  • Iterar sobre los caracteres de la string S usando la variable i y realizar los siguientes pasos:
    • Si S[i] es igual a S1[j] , entonces incremente i y j en 1.
    • Si j es igual a la longitud de s1 , agregue el valor (i – j) al vector encontrado y actualice j como lps[j – 1] .
    • De lo contrario, si el valor de S[i] no es igual a S1[j] , entonces si j es igual a 0 , entonces incremente el valor de i en 1 . De lo contrario, actualice j como lps[j – 1] .
  • Inicialice una variable, por ejemplo, anterior como 0 para almacenar el último índice modificado y una string vacía y ans para almacenar la string resultante después de reemplazar todas las apariencias iniciales de s1 por s2 en s.
  • Atraviese el vector found[] y si el valor de found[i] es mayor que prev , agregue la string S2 en lugar de S1 en ans .
  • Después de completar los pasos anteriores, imprima la string como resultado.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
  
#include <bits/stdc++.h>
using namespace std;
  
// Function to calculate the LPS array
// for the given string S1
vector<int> computeLPS(string& s1)
{
    // Stores the longest proper prefix
    // and suffix for each character
    // in the string s1
    vector<int> lps(s1.length());
    int len = 0;
  
    // Set lps value 0 for the first
    // character of the string s1
    lps[0] = 0;
  
    int i = 1;
  
    // Iterate to fill the lps vector
    while (i < s1.length()) {
        if (s1[i] == s1[len]) {
            len = len + 1;
            lps[i] = len;
            i = i + 1;
        }
        else {
  
            // If there is no longest
            // proper prefix which is
            // suffix, then set lps[i] = 0
            if (len == 0) {
                lps[i] = 0;
                i = i + 1;
            }
  
            // Otherwise
            else
                len = lps[len - 1];
        }
    }
  
    return lps;
}
  
// Function to replace all the occurrences
// of the substring S1 to S2 in string S
void modifyString(string& s, string& s1,
                  string& s2)
{
    vector<int> lps = computeLPS(s1);
    int i = 0;
    int j = 0;
  
    // Stores all the starting index
    // from character S1 occurs in S
    vector<int> found;
  
    // Iterate to find all starting
    // indexes and store all indices
    // in a vector found
    while (i < s.length()) {
        if (s[i] == s1[j]) {
            i = i + 1;
            j = j + 1;
        }
  
        // The string s1 occurrence is
        // found and store it in found[]
        if (j == s1.length()) {
            found.push_back(i - j);
            j = lps[j - 1];
        }
        else if (i < s.length()
                 && s1[j] != s[i]) {
            if (j == 0)
                i = i + 1;
            else
                j = lps[j - 1];
        }
    }
  
    // Stores the resultant string
    string ans = "";
    int prev = 0;
  
    // Traverse the vector found[]
    for (int k = 0; k < found.size(); k++) {
        if (found[k] < prev)
            continue;
        ans.append(s.substr(prev, found[k] - prev));
        ans.append(s2);
        prev = found[k] + s1.size();
    }
  
    ans.append(s.substr(prev,
                        s.length() - prev));
  
    // Print the resultant string
    cout << ans << endl;
}
  
// Driver Code
int main()
{
    string S = "geeksforgeeks";
    string S1 = "eek";
    string S2 = "ok";
    modifyString(S, S1, S2);
  
    return 0;
}
Producción: 

goksforgoks

 

Complejidad temporal: O(N + M)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por mansig647 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *