Es permeten cadenes diferents amb canvis parells i senars

Donada una matriu de cadenes en minúscules, la tasca és trobar el nombre de cadenes diferents. Dues cadenes són diferents si en aplicar les operacions següents sobre una cadena no es pot formar la segona cadena.  

  • Un caràcter de l'índex senar només es pot canviar per un altre de l'índex senar.
  • Un caràcter de l'índex parell només es pot intercanviar amb un altre caràcter de l'índex parell.

Exemples:   

Input : arr[] = {'abcd' 'cbad' 'bacd'} Output : 2 The 2nd string can be converted to the 1st by swapping the first and third characters. So there are 2 distinct  
strings as the third string cannot be converted to the first. Input : arr[] = {'abc' 'cba'} Output : 1  

A solució senzilla és executar dos bucles. El bucle exterior tria una cadena i el bucle interior comprova si hi ha una cadena prèviament que es pot convertir en una cadena actual fent transformacions permeses. Aquesta solució requereix O(n 2 m) temps on n és el nombre de cadenes i m és el nombre màxim de caràcters en qualsevol cadena.

An solució eficient genera una cadena codificada per a cada cadena d'entrada. El codificat té recomptes de caràcters parells i senars separats per un separador. Dues cadenes es consideren iguals si les seves cadenes codificades són iguals, en cas contrari no. Un cop tenim una manera de codificar cadenes, el problema es redueix a comptar diferents cadenes codificades. Aquest és un problema típic de hashing. Creem un conjunt hash i una per una emmagatzemem les codificacions de cadenes. Si ja existeix una codificació, ignorem la cadena. En cas contrari, emmagatzemem la codificació en hash i el recompte d'increments de diferents cadenes. 

Implementació:

C++
   #include       using     namespace     std  ;   int     MAX_CHAR     =     26  ;   string     encodeString  (  char     str  []     int     m  )     {      // hashEven stores the count of even indexed character      // for each string hashOdd stores the count of odd      // indexed characters for each string      int     hashEven  [  MAX_CHAR  ];      int     hashOdd  [  MAX_CHAR  ];      memset  (  hashEven    0    sizeof  (  hashEven  ));      memset  (  hashOdd    0    sizeof  (  hashOdd  ));      // creating hash for each string      for     (  int     i     =     0  ;     i      <     m  ;     i  ++  )     {      char     c     =     str  [  i  ];      if     ((  i     &     1  )     !=     0  )     // If index of current character is odd      hashOdd  [  c  -  'a'  ]  ++  ;      else      hashEven  [  c  -  'a'  ]  ++  ;      }      // For every character from 'a' to 'z' we store its      // count at even position followed by a separator      // followed by count at odd position.      string     encoding     =     ''  ;      for     (  int     i     =     0  ;     i      <     MAX_CHAR  ;     i  ++  )     {      encoding     +=     (  hashEven  [  i  ]);      encoding     +=     (  '-'  );      encoding     +=     (  hashOdd  [  i  ]);      encoding     +=     (  '-'  );      }      return     encoding  ;   }   // This function basically uses a hashing based set to   // store strings which are distinct according   // to criteria given in question.   int     countDistinct  (  string     input  []     int     n  )     {      int     countDist     =     0  ;     // Initialize result      // Create an empty set and store all distinct      // strings in it.      set   <  string  >     s  ;      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      // If this encoding appears first time increment      // count of distinct encodings.      char     char_array  [  input  [  i  ].  length  ()];      strcpy  (  char_array       input  [  i  ].  c_str  ());      if     (  s  .  find  (  encodeString  (  char_array       input  [  i  ].  length  ()))     ==     s  .  end  ())     {      s  .  insert  (  encodeString  (  char_array    input  [  i  ].  length  ()));      countDist  ++  ;      }      }      return     countDist  ;   }   int     main  ()     {      string     input  []     =     {  'abcd'       'acbd'       'adcb'       'cdba'        'bcda'       'badc'  };      int     n     =     sizeof  (  input  )  /  sizeof  (  input  [  0  ]);      cout      < <     countDistinct  (  input       n  )      < <     '  n  '  ;   }   // This code is contributed by Harshit Sharma.   
Java
   // Java program to count distinct strings with   // even odd swapping allowed.   import     java.util.HashSet  ;   import     java.util.Set  ;   class   GFG     {   static     int     MAX_CHAR     =     26  ;      static     String     encodeString  (  char  []     str  )     {      // hashEven stores the count of even indexed character      // for each string hashOdd stores the count of odd      // indexed characters for each string      int     hashEven  []     =     new     int  [  MAX_CHAR  ]  ;      int     hashOdd  []     =     new     int  [  MAX_CHAR  ]  ;      // creating hash for each string      for     (  int     i     =     0  ;     i      <     str  .  length  ;     i  ++  )     {      char     c     =     str  [  i  ]  ;      if     ((  i     &     1  )     !=     0  )     // If index of current character is odd      hashOdd  [  c  -  'a'  ]++  ;      else      hashEven  [  c  -  'a'  ]++  ;      }      // For every character from 'a' to 'z' we store its      // count at even position followed by a separator      // followed by count at odd position.      String     encoding     =     ''  ;      for     (  int     i     =     0  ;     i      <     MAX_CHAR  ;     i  ++  )     {      encoding     +=     (  hashEven  [  i  ]  );      encoding     +=     (  '-'  );      encoding     +=     (  hashOdd  [  i  ]  );      encoding     +=     (  '-'  );      }      return     encoding  ;      }      // This function basically uses a hashing based set to   // store strings which are distinct according   // to criteria given in question.      static     int     countDistinct  (  String     input  []       int     n  )     {      int     countDist     =     0  ;     // Initialize result      // Create an empty set and store all distinct      // strings in it.      Set   <  String  >     s     =     new     HashSet   <>  ();      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      // If this encoding appears first time increment      // count of distinct encodings.      if     (  !  s  .  contains  (  encodeString  (  input  [  i  ]  .  toCharArray  ())))     {      s  .  add  (  encodeString  (  input  [  i  ]  .  toCharArray  ()));      countDist  ++  ;      }      }      return     countDist  ;      }      public     static     void     main  (  String  []     args  )     {      String     input  []     =     {  'abcd'       'acbd'       'adcb'       'cdba'        'bcda'       'badc'  };      int     n     =     input  .  length  ;      System  .  out  .  println  (  countDistinct  (  input       n  ));      }   }   
Python3
   # Python3 program to count distinct strings with   # even odd swapping allowed.   MAX_CHAR   =   26   # Returns encoding of string that can be used    # for hashing. The idea is to return same encoding    # for strings which can become same after swapping    # a even positioned character with other even characters    # OR swapping an odd character with other odd characters.   def   encodeString  (  string  ):   # hashEven stores the count of even indexed character   # for each string hashOdd stores the count of odd   # indexed characters for each string   hashEven   =   [  0  ]   *   MAX_CHAR   hashOdd   =   [  0  ]   *   MAX_CHAR   # creating hash for each string   for   i   in   range  (  len  (  string  )):   c   =   string  [  i  ]   if   i   &   1  :   # If index of current character is odd   hashOdd  [  ord  (  c  )   -   ord  (  'a'  )]   +=   1   else  :   hashEven  [  ord  (  c  )   -   ord  (  'a'  )]   +=   1   # For every character from 'a' to 'z' we store its   # count at even position followed by a separator   # followed by count at odd position.   encoding   =   ''   for   i   in   range  (  MAX_CHAR  ):   encoding   +=   str  (  hashEven  [  i  ])   encoding   +=   str  (  '-'  )   encoding   +=   str  (  hashOdd  [  i  ])   encoding   +=   str  (  '-'  )   return   encoding   # This function basically uses a hashing based set to   # store strings which are distinct according   # to criteria given in question.   def   countDistinct  (  input     n  ):   countDist   =   0   # Initialize result   # Create an empty set and store all distinct   # strings in it.   s   =   set  ()   for   i   in   range  (  n  ):   # If this encoding appears first time increment   # count of distinct encodings.   if   encodeString  (  input  [  i  ])   not   in   s  :   s  .  add  (  encodeString  (  input  [  i  ]))   countDist   +=   1   return   countDist   # Driver Code   if   __name__   ==   '__main__'  :   input   =   [  'abcd'     'acbd'     'adcb'     'cdba'     'bcda'     'badc'  ]   n   =   len  (  input  )   print  (  countDistinct  (  input     n  ))   # This code is contributed by   # sanjeev2552   
C#
   // C# program to count distinct strings with   // even odd swapping allowed.   using     System  ;   using     System.Collections.Generic  ;          class     GFG   {      static     int     MAX_CHAR     =     26  ;      static     String     encodeString  (  char  []     str  )         {      // hashEven stores the count of even       // indexed character for each string       // hashOdd stores the count of odd      // indexed characters for each string      int     []  hashEven     =     new     int  [  MAX_CHAR  ];      int     []  hashOdd     =     new     int  [  MAX_CHAR  ];      // creating hash for each string      for     (  int     i     =     0  ;     i      <     str  .  Length  ;     i  ++  )         {      char     m     =     str  [  i  ];          // If index of current character is odd      if     ((  i     &     1  )     !=     0  )         hashOdd  [  m     -     'a'  ]  ++  ;      else      hashEven  [  m     -     'a'  ]  ++  ;      }      // For every character from 'a' to 'z'       // we store its count at even position       // followed by a separator       // followed by count at odd position.      String     encoding     =     ''  ;      for     (  int     i     =     0  ;     i      <     MAX_CHAR  ;     i  ++  )         {      encoding     +=     (  hashEven  [  i  ]);      encoding     +=     (  '-'  );      encoding     +=     (  hashOdd  [  i  ]);      encoding     +=     (  '-'  );      }      return     encoding  ;      }      // This function basically uses a hashing based set      // to store strings which are distinct according       // to criteria given in question.      static     int     countDistinct  (  String     []  input       int     n  )         {      int     countDist     =     0  ;     // Initialize result      // Create an empty set and store all distinct      // strings in it.      HashSet   <  String  >     s     =     new     HashSet   <  String  >  ();      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )         {      // If this encoding appears first time      // increment count of distinct encodings.      if     (  !  s  .  Contains  (  encodeString  (  input  [  i  ].  ToCharArray  ())))         {      s  .  Add  (  encodeString  (  input  [  i  ].  ToCharArray  ()));      countDist  ++  ;      }      }      return     countDist  ;      }      // Driver Code      public     static     void     Main  (  String  []     args  )         {      String     []  input     =     {  'abcd'       'acbd'       'adcb'           'cdba'       'bcda'       'badc'  };      int     n     =     input  .  Length  ;      Console  .  WriteLine  (  countDistinct  (  input       n  ));      }   }   // This code is contributed by 29AjayKumar   
JavaScript
    <  script  >      // Javascript program to count distinct strings with      // even odd swapping allowed      let     MAX_CHAR     =     26  ;          function     encodeString  (  str  )     {      // hashEven stores the count of even indexed character      // for each string hashOdd stores the count of odd      // indexed characters for each string      let     hashEven     =     Array  (  MAX_CHAR  ).  fill  (  0  );      let     hashOdd     =     Array  (  MAX_CHAR  ).  fill  (  0  );          // creating hash for each string      for     (  let     i     =     0  ;     i      <     str  .  length  ;     i  ++  )     {      let     c     =     str  [  i  ];      if     ((  i     &     1  )     !=     0  )     // If index of current character is odd      hashOdd  [  c  .  charCodeAt  ()     -     'a'  .  charCodeAt  ()]  ++  ;      else      hashEven  [  c  .  charCodeAt  ()     -     'a'  .  charCodeAt  ()]  ++  ;          }              // For every character from 'a' to 'z' we store its      // count at even position followed by a separator      // followed by count at odd position.      let     encoding     =     ''  ;      for     (  let     i     =     0  ;     i      <     MAX_CHAR  ;     i  ++  )     {      encoding     +=     (  hashEven  [  i  ]);      encoding     +=     (  '-'  );      encoding     +=     (  hashOdd  [  i  ]);      encoding     +=     (  '-'  );      }      return     encoding  ;      }          // This function basically uses a hashing based set to      // store strings which are distinct according      // to criteria given in question.      function     countDistinct  (  input       n  )     {      let     countDist     =     0  ;     // Initialize result          // Create an empty set and store all distinct      // strings in it.      let     s     =     new     Set  ();      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      // If this encoding appears first time increment      // count of distinct encodings.      if     (  !  s  .  has  (  encodeString  (  input  [  i  ].  split  (  ''  ))))     {      s  .  add  (  encodeString  (  input  [  i  ].  split  (  ''  )));      countDist  ++  ;      }      }          return     countDist  ;      }   // Driver program       let     input     =     [  'abcd'       'acbd'       'adcb'       'cdba'        'bcda'       'badc'  ];      let     n     =     input  .  length  ;          document  .  write  (  countDistinct  (  input       n  ));    <  /script>   

Sortida
4 

Complexitat temporal : O(n) 
Espai auxiliar: O(1)

 

Crea un qüestionari