Programa C++ para rotación a la izquierda y rotación a la derecha de una string

Dada una string de tamaño n, escriba funciones para realizar las siguientes operaciones en una string:

  1. Gire a la izquierda (o en sentido contrario a las agujas del reloj) la string dada por d elementos (donde d <= n)
  2. A la derecha (o en el sentido de las agujas del reloj) gire la string dada por d elementos (donde d <= n).

Ejemplos: 

Input : s = "GeeksforGeeks"
        d = 2
Output : Left Rotation  : "eksforGeeksGe" 
         Right Rotation : "ksGeeksforGee"  


Input : s = "qwertyu" 
        d = 2
Output : Left rotation : "ertyuqw"
         Right rotation : "yuqwert"

Una solución simple es usar una string temporal para hacer rotaciones. Para la rotación a la izquierda, primero, copie los últimos caracteres nd, luego copie los primeros caracteres d en la string temporal. Para la rotación a la derecha, primero, copie los últimos caracteres d, luego copie los caracteres nd. 

¿Podemos hacer ambas rotaciones en el lugar y en tiempo O(n)?  
La idea se basa en un algoritmo de inversión para la rotación .

// Left rotate string s by d (Assuming d <= n)
leftRotate(s, d)
  reverse(s, 0, d-1); // Reverse substring s[0..d-1]
  reverse(s, d, n-1); // Reverse substring s[d..n-1]
  reverse(s, 0, n-1); // Reverse whole string.  

// Right rotate string s by d (Assuming d <= n)
rightRotate(s, d)

  // We can also call above reverse steps
  // with d = n-d.
  leftRotate(s, n-d)  

A continuación se muestra la implementación de los pasos anteriores: 

C++

// C program for Left Rotation and Right
// Rotation of a String
#include<bits/stdc++.h>
using namespace std;
 
// In-place rotates s towards left by d
void leftrotate(string &s, int d)
{
    reverse(s.begin(), s.begin()+d);
    reverse(s.begin()+d, s.end());
    reverse(s.begin(), s.end());
}
 
// In-place rotates s towards right by d
void rightrotate(string &s, int d)
{
   leftrotate(s, s.length()-d);
}
 
// Driver code
int main()
{
    string str1 = "GeeksforGeeks";
    leftrotate(str1, 2);
    cout << str1 << endl;
 
    string str2 = "GeeksforGeeks";
    rightrotate(str2, 2);
    cout << str2 << endl;
    return 0;
}

Producción: 

Left rotation:  eksforGeeksGe
Right rotation:  ksGeeksforGee                 

Complejidad de tiempo: O(N), ya que estamos usando un bucle para atravesar N veces, por lo que nos costará O(N) tiempo 
Espacio auxiliar: O(1), ya que no estamos usando ningún espacio adicional.

Consulte el artículo completo sobre Rotación a la izquierda y Rotación a la derecha de una string para obtener más detalles.

Publicación traducida automáticamente

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