Intercambiar caracteres en una string

Dada una String S de longitud N , dos enteros B y C , la tarea es atravesar caracteres comenzando desde el principio, intercambiando un carácter con el carácter después de que C se coloque a partir de él, es decir, intercambiar caracteres en la posición i y (i + C)% n _ Repita este proceso B veces, avanzando una posición a la vez. Su tarea es encontrar la string final después de los intercambios de B.

Ejemplos: 

Input : S = "ABCDEFGH", B = 4, C = 3;
Output:  DEFGBCAH
Explanation:
         after 1st swap: DBCAEFGH
         after 2nd swap: DECABFGH
         after 3rd swap: DEFABCGH
         after 4th swap: DEFGBCAH

Input : S = "ABCDE", B = 10, C = 6;
Output : ADEBC
Explanation:
         after 1st swap: BACDE
         after 2nd swap: BCADE
         after 3rd swap: BCDAE
         after 4th swap: BCDEA
         after 5th swap: ACDEB
         after 6th swap: CADEB
         after 7th swap: CDAEB
         after 8th swap: CDEAB
         after 9th swap: CDEBA
         after 10th swap: ADEBC

Enfoque ingenuo

  • Para valores grandes de B , el enfoque ingenuo de repetir B veces, cada vez que se intercambia el i-ésimo carácter con (i + C)%N-ésimo carácter dará como resultado un tiempo de CPU elevado.
  • El truco para resolver este problema es observar la string resultante después de cada N iteraciones, donde N es la longitud de la string S.
  • Nuevamente, si C es mayor o igual que N , es efectivamente igual al resto de C dividido por N.
  • En adelante , consideremos que C es menor que N.

Enfoque eficiente: 

  • Si observamos la string que se forma después de cada N iteraciones sucesivas e intercambios (llamémoslo una iteración completa), podemos comenzar a obtener un patrón.
  • Podemos encontrar que la string se divide en dos partes: la primera parte de longitud C que comprende los primeros caracteres C de S , y la segunda parte que comprende el resto de los caracteres.
  • Las dos partes se giran por algunos lugares. La primera parte se gira a la derecha (N % C) coloca cada iteración completa.
  • La segunda parte se rota a la izquierda por C coloca cada iteración completa.
  • Podemos calcular el número de iteraciones completas f dividiendo B por N .
  • Entonces, la primera parte se rotará a la izquierda por ( N ​​% C ) * f . Este valor puede ir más allá de C y, por lo tanto, es efectivamente ( ( N % C ) * f ) % C , es decir, la primera parte se rotará por ( ( N % C ) * f ) % C lugares restantes.
  • La segunda parte se girará a la izquierda C * f lugares. Dado que este valor puede ir más allá de la longitud de la segunda parte que es ( N – C ) , es efectivamente ( ( C * f ) % ( N – C ) ) , es decir, la segunda parte girará en ( ( C * f ) % ( N – C ) ) lugares restantes.
  • Después de f iteraciones completas, aún pueden quedar algunas iteraciones para completar B iteraciones. Este valor es B % N que es menor que N . Podemos seguir el enfoque ingenuo en estas iteraciones restantes después de f iteraciones completas para obtener la string resultante.

Ejemplo:
s = ABCDEFGHIJK; c = 4;
partes: ABCD EFGHIJK
después de 1 iteración completa: DABC IJKEFGH 
después de 2 iteraciones completas: CDAB FGHIJKE 
después de 3 iteraciones completas: BCDA JKEFGHI 
después de 4 iteraciones completas: ABCD GHIJKEF 
después de 5 iteraciones completas: DABC KEFGHIJ 
después de 6 iteraciones completas: CDAB HIJKEFG 
después de 7 iteraciones completas : BCDA EFGHIJK 
después de 8 iteraciones completas: ABCD IJKEFGH 
 

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

C++

// C++ program to find new after swapping
// characters at position i and i + c
// b times, each time advancing one
// position ahead
#include <bits/stdc++.h>
using namespace std;
 
string rotateLeft(string s, int p)
{
     
    // Rotating a string p times left is
    // effectively cutting the first p
    // characters and placing them at the end
    return s.substr(p) + s.substr(0, p);
}
 
// Method to find the required string
string swapChars(string s, int c, int b)
{
     
    // Get string length
    int n = s.size();
     
    // If c is larger or equal to the length of
    // the string is effectively the remainder of
    // c divided by the length of the string
    c = c % n;
     
    if (c == 0)
    {
         
        // No change will happen
        return s;
    }
    int f = b / n;
    int r = b % n;
     
    // Rotate first c characters by (n % c)
    // places f times
    string p1 = rotateLeft(s.substr(0, c),
                  ((n % c) * f) % c);
                   
    // Rotate remaining character by
    // (n * f) places
    string p2 = rotateLeft(s.substr(c),
                  ((c * f) % (n - c)));
                   
    // Concatenate the two parts and convert the
    // resultant string formed after f full
    // iterations to a string array
    // (for final swaps)
    string a = p1 + p2;
     
    // Remaining swaps
    for(int i = 0; i < r; i++)
    {
         
        // Swap ith character with
        // (i + c)th character
        char temp = a[i];
        a[i] = a[(i + c) % n];
        a[(i + c) % n] = temp;
    }
     
    // Return final string
    return a;
}
 
// Driver code
int main()
{
     
    // Given values
    string s1 = "ABCDEFGHIJK";
    int b = 1000;
    int c = 3;
     
    // Get final string print final string
    cout << swapChars(s1, c, b) << endl;
}
 
// This code is contributed by rag2127

Java

// Java Program to find new after swapping
// characters at position i and i + c
// b times, each time advancing one
// position ahead
 
class GFG {
    // Method to find the required string
 
    String swapChars(String s, int c, int b)
    {
        // Get string length
        int n = s.length();
 
        // if c is larger or equal to the length of
        // the string is effectively the remainder of
        // c divided by the length of the string
        c = c % n;
 
        if (c == 0) {
            // No change will happen
            return s;
        }
 
        int f = b / n;
        int r = b % n;
 
        // Rotate first c characters by (n % c)
        // places f times
        String p1 = rotateLeft(s.substring(0, c),
                               ((n % c) * f) % c);
 
        // Rotate remaining character by
        // (n * f) places
        String p2 = rotateLeft(s.substring(c),
                               ((c * f) % (n - c)));
 
        // Concatenate the two parts and convert the
        // resultant string formed after f full
        // iterations to a character array
        // (for final swaps)
        char a[] = (p1 + p2).toCharArray();
 
        // Remaining swaps
        for (int i = 0; i < r; i++) {
 
            // Swap ith character with
            // (i + c)th character
            char temp = a[i];
            a[i] = a[(i + c) % n];
            a[(i + c) % n] = temp;
        }
 
        // Return final string
        return new String(a);
    }
 
    String rotateLeft(String s, int p)
    {
        // Rotating a string p times left is
        // effectively cutting the first p
        // characters and placing them at the end
        return s.substring(p) + s.substring(0, p);
    }
 
    // Driver code
    public static void main(String args[])
    {
        // Given values
        String s1 = "ABCDEFGHIJK";
        int b = 1000;
        int c = 3;
 
        // get final string
        String s2 = new GFG().swapChars(s1, c, b);
 
        // print final string
        System.out.println(s2);
    }
}

Python3

# Python3 program to find new after swapping
# characters at position i and i + c
# b times, each time advancing one
# position ahead
 
# Method to find the required string
def swapChars(s, c, b):
     
    # Get string length
    n = len(s)
     
    # If c is larger or equal to the length of
    # the string is effectively the remainder of
    # c divided by the length of the string
    c = c % n
     
    if (c == 0):
         
        # No change will happen
        return s
         
    f = int(b / n)
    r = b % n
     
    # Rotate first c characters by (n % c)
    # places f times
    p1 = rotateLeft(s[0 : c], ((c * f) % (n - c)))
     
    # Rotate remaining character by
    # (n * f) places
    p2 = rotateLeft(s[c:], ((c * f) % (n - c)))
     
    # Concatenate the two parts and convert the
    # resultant string formed after f full
    # iterations to a character array
    # (for final swaps)
    a = p1 + p2
    a = list(a)
     
    # Remaining swaps
    for i in range(r):
         
        # Swap ith character with
        # (i + c)th character
        temp = a[i]
        a[i] = a[(i + c) % n]
        a[(i + c) % n] = temp
 
    # Return final string
    return str("".join(a))
 
def rotateLeft(s, p):
     
    # Rotating a string p times left is
    # effectively cutting the first p
    # characters and placing them at the end
    return s[p:] + s[0 : p]
 
# Driver code
 
# Given values
s1 = "ABCDEFGHIJK"
b = 1000
c = 3
 
# Get final string
s2 = swapChars(s1, c, b)
 
# Print final string
print(s2)
 
# This code is contributed by avanitrachhadiya2155

C#

// C# Program to find new after swapping
// characters at position i and i + c
// b times, each time advancing one
// position ahead
using System;
 
class GFG
{
    // Method to find the required string
    String swapChars(String s, int c, int b)
    {
        // Get string length
        int n = s.Length;
 
        // if c is larger or equal to the length of
        // the string is effectively the remainder of
        // c divided by the length of the string
        c = c % n;
 
        if (c == 0)
        {
            // No change will happen
            return s;
        }
 
        int f = b / n;
        int r = b % n;
 
        // Rotate first c characters by (n % c)
        // places f times
        String p1 = rotateLeft(s.Substring(0, c),
                            ((n % c) * f) % c);
 
        // Rotate remaining character by
        // (n * f) places
        String p2 = rotateLeft(s.Substring(c),
                            ((c * f) % (n - c)));
 
        // Concatenate the two parts and convert the
        // resultant string formed after f full
        // iterations to a character array
        // (for readonly swaps)
        char []a = (p1 + p2).ToCharArray();
 
        // Remaining swaps
        for (int i = 0; i < r; i++)
        {
 
            // Swap ith character with
            // (i + c)th character
            char temp = a[i];
            a[i] = a[(i + c) % n];
            a[(i + c) % n] = temp;
        }
 
        // Return readonly string
        return new String(a);
    }
 
    String rotateLeft(String s, int p)
    {
         
        // Rotating a string p times left is
        // effectively cutting the first p
        // characters and placing them at the end
        return s.Substring(p) + s.Substring(0, p);
    }
 
    // Driver code
    public static void Main(String []args)
    {
        // Given values
        String s1 = "ABCDEFGHIJK";
        int b = 1000;
        int c = 3;
 
        // get readonly string
        String s2 = new GFG().swapChars(s1, c, b);
 
        // print readonly string
        Console.WriteLine(s2);
    }
}
 
// This code is contributed by 29AjayKumar

Javascript

<script>
// Javascript Program to find new after swapping
// characters at position i and i + c
// b times, each time advancing one
// position ahead
 
function swapChars(s, c, b)
{
 
    // Get string length
        let n = s.length;
  
        // if c is larger or equal to the length of
        // the string is effectively the remainder of
        // c divided by the length of the string
        c = c % n;
  
        if (c == 0) {
            // No change will happen
            return s;
        }
  
        let f = Math.floor(b / n);
        let r = b % n;
  
        // Rotate first c characters by (n % c)
        // places f times
        let p1 = rotateLeft(s.substring(0, c),
                               ((n % c) * f) % c);
  
        // Rotate remaining character by
        // (n * f) places
        let p2 = rotateLeft(s.substring(c),
                               ((c * f) % (n - c)));
  
        // Concatenate the two parts and convert the
        // resultant string formed after f full
        // iterations to a character array
        // (for final swaps)
        let a = (p1 + p2).split("");
  
        // Remaining swaps
        for (let i = 0; i < r; i++) {
  
            // Swap ith character with
            // (i + c)th character
            let temp = a[i];
            a[i] = a[(i + c) % n];
            a[(i + c) % n] = temp;
        }
  
        // Return final string
        return (a).join("");
}
 
function rotateLeft(s,p)
{
    // Rotating a string p times left is
        // effectively cutting the first p
        // characters and placing them at the end
        return s.substring(p) + s.substring(0, p);
}
 
 // Driver code
// Given values
let s1 = "ABCDEFGHIJK";
let b = 1000;
let c = 3;
 
// get final string
let s2 = swapChars(s1, c, b);
 
// print final string
document.write(s2);
     
// This code is contributed by ab2127
</script>
Producción: 

CADEFGHIJKB

 

Complejidad de tiempo : O(n) 
Complejidad de espacio : O(n)
 

Publicación traducida automáticamente

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