Cadena desplazada de grupo

Cadena desplazada de grupo
Pruébalo en GfG Practice

Dada una serie de cadenas (todas letras minúsculas), la tarea es agruparlas de tal manera que todas las cadenas de un grupo sean versiones desplazadas entre sí.

dos cuerdas s1 y s2 se llaman desplazados si se cumplen las siguientes condiciones:

  • s1.longitud es igual a s2.longitud
  • s1[yo] es igual a s2[yo] + metro para todos 1 <= i <= s1.length for a  constante  entero m. Considere que el cambio es cíclico, es decir, si s2[i] + m > 'z', entonces comience desde 'a' o si s2[i] + m < 'a' then start from 'z'.

Ejemplos:

Aporte: arr[] = ['acd' 'dfg' 'wyz' 'yab' 'mop' 'bdfh' 'a' 'x' 'moqs']
Producción: [ ['acd' 'dfg' 'wyz' 'yab' 'mop'] ['bdfh' 'moqs'] ['a' 'x'] ]
Explicación: Todas las cadenas desplazadas se agrupan.

Aporte: arr = ['geek' 'para' 'geeks']
Producción: [['para'] ['geek'] ['geeks']]

Enfoque: uso del mapa hash

La idea es generar un único picadillo para cada grupo por normalizando las cuerdas. Aquí normalizando significa hacer que el primer carácter de cada cadena sea igual a 'a' calculando el valor requerido turnos y aplicándolo uniformemente a todos los personajes en moda cíclica .
Ejemplo: s = 'dca' desplazamientos = 'd' - 'a' = 3
caracteres normalizados: 'd' - 3 = 'a' 'c' - 3 = 'z' y 'a' - 3 = 'x'
cadena normalizada = 'azx'

El cadena normalizada (hash) representa el patrón de cambio de modo que las cadenas con el mismo patrón tengan el mismo hash. Usamos un mapa de hash para rastrear estos hashes y asignarlos a los grupos correspondientes. Para cada cadena calculamos un hash y lo usamos para crear un nuevo grupo o agregar la cadena a un grupo existente en un solo recorrido.

C++
   // C++ program to print groups of shifted strings   // together using Hash Map   #include          #include         #include         using     namespace     std  ;   // Function to generate hash by shifting and equating    // the first character   string     getHash  (  string     s  )     {          // Calculate the shift needed to normalize the string      int     shifts     =     s  [  0  ]     -     'a'  ;         for     (  char     &  ch     :     s  )     {         // Adjust each character by the shift      ch     =     ch     -     shifts  ;             // Wrap around if the character goes below 'a'      if     (  ch      <     'a'  )         ch     +=     26  ;         }      return     s  ;   }   // Function to group shifted string together   vector   <  vector   <  string  >>     groupShiftedString  (  vector   <  string  >     &  arr  )     {      vector   <  vector   <  string  >>     res  ;             // Maps hash to index in result      unordered_map   <  string       int  >     mp  ;             for     (  string     s     :     arr  )     {         // Generate hash representing the shift pattern      string     hash     =     getHash  (  s  );             // If new hash create a new group      if     (  mp  .  find  (  hash  )     ==     mp  .  end  ())     {         mp  [  hash  ]     =     res  .  size  ();         res  .  push_back  ({});      }      // Add string to its group      res  [  mp  [  hash  ]].  push_back  (  s  );         }      return     res  ;   }   int     main  ()     {      vector   <  string  >     arr     =     {  'acd'       'dfg'       'wyz'       'yab'       'mop'       'bdfh'       'a'       'x'       'moqs'  };      vector   <  vector   <  string  >>     groups     =     groupShiftedString  (  arr  );          for     (  vector   <  string  >     &  group     :     groups  )     {      for     (  string     &  s     :     group  )     {      cout      < <     s      < <     ' '  ;      }      cout      < <     endl  ;      }      return     0  ;   }   
Java
   // Java program to print groups of shifted strings   // together using Hash Map   import     java.util.*  ;   class   GfG     {      // Function to generate hash by shifting and equating the      // first character      static     String     getHash  (  String     s  )     {          // Calculate the shift needed to normalize the string      int     shifts     =     s  .  charAt  (  0  )     -     'a'  ;         char  []     chars     =     s  .  toCharArray  ();          for     (  int     i     =     0  ;     i      <     chars  .  length  ;     i  ++  )     {          // Adjust each character by the shift      chars  [  i  ]     =     (  char  )     (  chars  [  i  ]     -     shifts  );             // Wrap around if the character goes below 'a'      if     (  chars  [  i  ]      <     'a'  )         chars  [  i  ]     +=     26  ;         }      return     new     String  (  chars  );      }      // Function to group shifted strings together      static     ArrayList   <  ArrayList   <  String  >>     groupShiftedString  (  String  []     arr  )     {      ArrayList   <  ArrayList   <  String  >>     res     =     new     ArrayList   <>  ();          // Maps hash to index in result      HashMap   <  String       Integer  >     mp     =     new     HashMap   <>  ();         for     (  String     s     :     arr  )     {          // Generate hash representing the shift pattern      String     hash     =     getHash  (  s  );         // If new hash create a new group      if     (  !  mp  .  containsKey  (  hash  ))     {      mp  .  put  (  hash       res  .  size  ());      res  .  add  (  new     ArrayList   <>  ());      }      // Add string to its group      res  .  get  (  mp  .  get  (  hash  )).  add  (  s  );         }      return     res  ;      }      public     static     void     main  (  String  []     args  )     {      String  []     arr     =     {  'acd'       'dfg'       'wyz'       'yab'       'mop'       'bdfh'       'a'       'x'       'moqs'  };      ArrayList   <  ArrayList   <  String  >>     groups     =     groupShiftedString  (  arr  );      for     (  ArrayList   <  String  >     group     :     groups  )     {      for     (  String     s     :     group  )     {      System  .  out  .  print  (  s     +     ' '  );      }      System  .  out  .  println  ();      }      }   }   
Python
   # Python program to print groups of shifted strings   # together using Hash Map   # Function to generate hash by shifting and equating the first character   def   getHash  (  s  ):   # Calculate the shift needed to normalize the string   shifts   =   ord  (  s  [  0  ])   -   ord  (  'a'  )   hashVal   =   []   for   ch   in   s  :   # Adjust each character by the shift   newCh   =   chr  (  ord  (  ch  )   -   shifts  )   # Wrap around if the character goes below 'a'   if   newCh    <   'a'  :   newCh   =   chr  (  ord  (  newCh  )   +   26  )   hashVal  .  append  (  newCh  )   return   ''  .  join  (  hashVal  )   # Function to group shifted strings together   def   groupShiftedString  (  arr  ):   res   =   []   # Maps hash to index in result   mp   =   {}   for   s   in   arr  :   # Generate hash representing the shift pattern   hashVal   =   getHash  (  s  )   # If new hash create a new group   if   hashVal   not   in   mp  :   mp  [  hashVal  ]   =   len  (  res  )   res  .  append  ([])   # Add string to its group   res  [  mp  [  hashVal  ]]  .  append  (  s  )   return   res   if   __name__   ==   '__main__'  :   arr   =   [  'acd'     'dfg'     'wyz'     'yab'     'mop'     'bdfh'     'a'     'x'     'moqs'  ]   groups   =   groupShiftedString  (  arr  )   for   group   in   groups  :   print  (  ' '  .  join  (  group  ))   
C#
   // C# program to print groups of shifted strings   // together using Hash Map   using     System  ;   using     System.Collections.Generic  ;   class     GfG     {          // Function to generate hash by shifting and equating the first character      static     string     getHash  (  string     s  )     {      // Calculate the shift needed to normalize the string      int     shifts     =     s  [  0  ]     -     'a'  ;         char  []     chars     =     s  .  ToCharArray  ();          for     (  int     i     =     0  ;     i      <     chars  .  Length  ;     i  ++  )     {      // Adjust each character by the shift      chars  [  i  ]     =     (  char  )(  chars  [  i  ]     -     shifts  );             // Wrap around if the character goes below 'a'      if     (  chars  [  i  ]      <     'a'  )         chars  [  i  ]     +=     (  char  )  26  ;         }      return     new     string  (  chars  );      }      // Function to group shifted strings together      static     List   <  List   <  string  >>     groupShiftedString  (  string  []     arr  )     {      List   <  List   <  string  >>     res     =     new     List   <  List   <  string  >>  ();          // Maps hash to index in result      Dictionary   <  string       int  >     mp     =     new     Dictionary   <  string       int  >  ();         foreach     (  string     s     in     arr  )     {      // Generate hash representing the shift pattern      string     hash     =     getHash  (  s  );         // If new hash create a new group      if     (  !  mp  .  ContainsKey  (  hash  ))     {         mp  [  hash  ]     =     res  .  Count  ;      res  .  Add  (  new     List   <  string  >  ());      }      // Add string to its group      res  [  mp  [  hash  ]].  Add  (  s  );         }      return     res  ;      }      static     void     Main  (  string  []     args  )     {      string  []     arr     =     {     'acd'       'dfg'       'wyz'       'yab'       'mop'       'bdfh'       'a'       'x'       'moqs'     };      var     groups     =     groupShiftedString  (  arr  );      foreach     (  var     group     in     groups  )     {      Console  .  WriteLine  (  string  .  Join  (  ' '       group  ));      }      }   }   
JavaScript
   // JavaScript program to print groups of shifted strings   // together using Hash Map   // Function to generate hash by shifting and equating the first character   function     getHash  (  s  )     {          // Calculate the shift needed to normalize the string      const     shifts     =     s  .  charCodeAt  (  0  )     -     'a'  .  charCodeAt  (  0  );             let     chars     =     [];      for     (  let     ch     of     s  )     {      // Adjust each character by the shift      let     newChar     =     String  .  fromCharCode  (  ch  .  charCodeAt  (  0  )     -     shifts  );          // Wrap around if the character goes below 'a'      if     (  newChar      <     'a'  )         newChar     =     String  .  fromCharCode  (  newChar  .  charCodeAt  (  0  )     +     26  );         chars  .  push  (  newChar  );      }          return     chars  .  join  (  ''  );   }   // Function to group shifted strings together   function     groupShiftedString  (  arr  )     {      const     res     =     [];             // Maps hash to index in result      const     mp     =     new     Map  ();         for     (  let     s     of     arr  )     {      // Generate hash representing the shift pattern      const     hash     =     getHash  (  s  );         // If new hash create a new group      if     (  !  mp  .  has  (  hash  ))     {         mp  .  set  (  hash       res  .  length  );      res  .  push  ([]);      }      // Add string to its group      res  [  mp  .  get  (  hash  )].  push  (  s  );         }      return     res  ;   }   // Driver Code   const     arr     =     [  'acd'       'dfg'       'wyz'       'yab'       'mop'       'bdfh'       'a'       'x'       'moqs'  ];   const     groups     =     groupShiftedString  (  arr  );   groups  .  forEach  (  group     =>     console  .  log  (  group  .  join  (  ' '  )));   

Producción
acd dfg wyz yab mop bdfh moqs a x  

Complejidad del tiempo: O(n*k) donde n es la longitud de la matriz de cadenas y k es la longitud máxima de una cadena en la matriz de cadenas.
Espacio Auxiliar: O(n*k) en el peor de los casos, podríamos generar n cadenas hash diferentes respectivamente para cada cadena de entrada. Entonces obtuvimos n entradas diferentes en el mapa hash, cada una de ellas de longitud k o menos.