Substrings inversas de una string dada de acuerdo con los índices de array especificados

Dada la string str de longitud N y una array arr[] de enteros, para el elemento de array arr[i]( indexación basada en 1 ) , invierta la substring en índices [arr[i], N – arr[i] + 1] . La tarea es imprimir la string después de cada inversión.

Ejemplos:

Entrada: str = «GeeksforGeeks», arr[] = {2}
Salida : GkeeGrofskees
Explicación:
Para el primer elemento de la array es 2:
Invierta la substring (2, 12). Ahora la string actualizada es «GkeeGrofskees».

Entrada: str = “abcdef”, arr[] = {1, 2, 3}
Salida: fbdcea
Explicación:
Para el primer elemento de la array es 1:
Invierta la substring (1, 6). Ahora la string actualizada es «fedcba».
Para el segundo elemento de la array es 2:
invierta la substring (2, 5). Ahora la string actualizada es «fbcdea».
Para el tercer elemento de la array es 3:
invierta la substring (3, 4). Ahora la string actualizada es «fbdcea».

Enfoque ingenuo: el enfoque más simple es atravesar la array dada y para cada elemento de array arr[i] invertir la substring {s[arr[i]], … s[N – arr[i] + 1]} e imprimir la resultante string obtenida después de una actualización. 

Complejidad de tiempo: O(N * K), donde N es la longitud de la string y K es la longitud máxima de la substring invertida.
Espacio Auxiliar: O(1)

Enfoque eficiente: el enfoque anterior se puede optimizar manteniendo un registro de la cantidad de veces que se ha invertido cualquier carácter en un índice. Si el recuento de inversión es par , entonces el personaje volverá a su lugar original, por lo que no habrá cambios y si el recuento de inversión es impar , entonces el personaje debe intercambiarse. A continuación se muestran los pasos:

  • Inicialice una array count[] para almacenar el número de reversiones en cualquier índice de la string.
  • Recorre la array dada arr[] e incrementa el recuento de índices count[arr[i]] en 1 .
  • Ahora, recorra la array count[] sobre el rango [1, N/2] usando la variable i y haga lo siguiente:
    • Actualice el elemento en el índice actual como la suma del índice actual y el anterior.
    • Ahora, si el elemento actual count[i] es impar, entonces intercambie str[i] y str[N – i + 1] .
  • Imprima la string después de los pasos anteriores.

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

C++

// C++ program for the above approach
 
#include <iostream>
using namespace std;
 
// Function to perform the reversal
// operation on the given string
string modifyString(int A[], string str,
                    int K)
{
    // Size of string
    int N = str.size();
 
    // Stores the count of indices
    int count[N + 1] = { 0 };
 
    // Count the positions where
    // reversals will begin
    for (int i = 0; i < K; i++) {
        count[A[i]]++;
    }
 
    for (int i = 1; i <= N / 2; i++) {
 
        // Store the count of reversals
        // beginning at position i
        count[i] = count[i] + count[i - 1];
 
        // Check if the count[i] is
        // odd the swap the character
        if (count[i] & 1) {
            swap(str[i - 1], str[N - i]);
        }
    }
 
    // Return the updated string
    return str;
}
 
// Driver Code
int main()
{
    // Given string str
    string str = "abcdef";
 
    // Given array of reversing index
    int arr[] = { 1, 2, 3 };
 
    int K = sizeof(arr) / sizeof(arr[0]);
 
    // Function Call
    cout << modifyString(arr, str, K);
 
    return 0;
}

Java

// Java program for the above approach
import java.util.*;
 
class GFG{
 
// Function to perform the reversal
// operation on the given String
static String modifyString(int A[], String str,
                           int K)
{
     
    // Size of String
    int N = str.length();
 
    // Stores the count of indices
    int count[] = new int[N + 1];
 
    // Count the positions where
    // reversals will begin
    for(int i = 0; i < K; i++)
    {
        count[A[i]]++;
    }
 
    for(int i = 1; i <= N / 2; i++)
    {
         
        // Store the count of reversals
        // beginning at position i
        count[i] = count[i] + count[i - 1];
 
        // Check if the count[i] is
        // odd the swap the character
        if ((count[i] & 1) > 0)
        {
            str = swap(str, i - 1, N - i);
        }
    }
 
    // Return the updated String
    return str;
}
 
// Swap char of a string
static String swap(String str, int i, int j)
{
    char ch[] = str.toCharArray();
    char temp = ch[i];
    ch[i] = ch[j];
    ch[j] = temp;
    return String.valueOf(ch);
}
 
// Driver Code
public static void main(String[] args)
{
     
    // Given String str
    String str = "abcdef";
 
    // Given array of reversing index
    int arr[] = { 1, 2, 3 };
 
    int K = arr.length;
 
    // Function Call
    System.out.print(modifyString(arr, str, K));
}
}
 
// This code is contributed by Amit Katiyar

Python3

# Python3 program for the above approach
 
# Function to perform the reversal
# operation on the given string
def modifyString(A, str, K):
     
    # Size of string
    N = len(str)
 
    # Stores the count of indices
    count = [0] * (N + 1)
 
    # Count the positions where
    # reversals will begin
    for i in range(K):
        count[A[i]] += 1
 
    for i in range(1, N // 2 + 1):
         
        # Store the count of reversals
        # beginning at position i
        count[i] = count[i] + count[i - 1]
 
        # Check if the count[i] is
        # odd the swap the character
        if (count[i] & 1):
            str[i - 1], str[N - i] = str[N - i], str[i - 1]
 
    # Return the updated string
    return "".join(str)
 
# Driver Code
if __name__ == '__main__':
     
    # Given str
    str1 = "abcdef"
    str = [i for i in str1]
 
    # Given array of reversing index
    arr = [ 1, 2, 3 ]
 
    K = len(arr)
     
    # Function Call
    print(modifyString(arr, str, K))
 
# This code is contributed by mohit kumar 29

C#

// C# program for the above approach
using System;
 
class GFG{
 
// Function to perform the reversal
// operation on the given String
static String modifyString(int []A, String str,
                           int K)
{
     
    // Size of String
    int N = str.Length;
 
    // Stores the count of indices
    int []count = new int[N + 1];
 
    // Count the positions where
    // reversals will begin
    for(int i = 0; i < K; i++)
    {
        count[A[i]]++;
    }
 
    for(int i = 1; i <= N / 2; i++)
    {
         
        // Store the count of reversals
        // beginning at position i
        count[i] = count[i] + count[i - 1];
 
        // Check if the count[i] is
        // odd the swap the character
        if ((count[i] & 1) > 0)
        {
            str = swap(str, i - 1, N - i);
        }
    }
 
    // Return the updated String
    return str;
}
 
// Swap char of a string
static String swap(String str, int i, int j)
{
    char []ch = str.ToCharArray();
    char temp = ch[i];
    ch[i] = ch[j];
    ch[j] = temp; 
    return String.Join("", ch);
}
 
// Driver Code
public static void Main(String[] args)
{
     
    // Given String str
    String str = "abcdef";
 
    // Given array of reversing index
    int []arr = { 1, 2, 3 };
 
    int K = arr.Length;
 
    // Function Call
    Console.Write(modifyString(arr, str, K));
}
}
 
// This code is contributed by Amit Katiyar

Javascript

<script>
 
// JavaScript program for the above approach
 
 
// Function to perform the reversal
// operation on the given String
function modifyString(A, str, K) {
 
    // Size of String
    str = str.split("")
    let N = str.length;
 
    // Stores the count of indices
    let count = new Array(N + 1).fill(0);
 
    // Count the positions where
    // reversals will begin
    for (let i = 0; i < K; i++) {
        count[A[i]] += 1;
    }
 
    for (let i = 1; i <= N / 2; i++) {
 
        // Store the count of reversals
        // beginning at position i
        count[i] = count[i] + count[i - 1];
 
        // Check if the count[i] is
        // odd the swap the character
        if (count[i] & 1) {
            let temp = str[i - 1];
            str[i - 1] = str[N - i];
            str[N - i] = temp
        }
    }
 
    // Return the updated String
    return str.join("");
}
 
 
 
// Driver Code
 
// Given String str
let str = "abcdef";
 
// Given array of reversing index
let arr = [1, 2, 3];
 
let K = arr.length;
 
// Function Call
document.write(modifyString(arr, str, K));
 
// This code is contributed by gfgking
 
</script>
Producción: 

fbdcea

 

Complejidad de tiempo: O(N + K), donde N es la longitud de la string y K es la longitud máxima de la substring invertida. 
Espacio Auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por ashishsonam00 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 *