홀수 및 짝수 변경이 허용되는 고유한 문자열

소문자 문자열 배열이 주어지면 고유한 문자열 수를 찾는 작업이 수행됩니다. 한 문자열에 다음 작업을 적용할 때 두 번째 문자열을 구성할 수 없는 경우 두 문자열은 서로 다릅니다.  

  • 홀수 인덱스의 문자는 홀수 인덱스의 다른 문자로만 교체될 수 있습니다.
  • 짝수 인덱스의 문자는 짝수 인덱스의 다른 문자로만 교체될 수 있습니다.

예:   

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  

에이 간단한 해결책 두 개의 루프를 실행하는 것입니다. 외부 루프는 문자열을 선택하고 내부 루프는 허용된 변환을 수행하여 현재 문자열로 변환할 수 있는 이전 문자열이 있는지 확인합니다. 이 솔루션에는 O(n 2 m) 시간 여기서 n은 문자열 수이고 m은 문자열의 최대 문자 수입니다.

효율적인 솔루션 모든 입력 문자열에 대해 인코딩된 문자열을 생성합니다. 인코딩된 문자에는 구분 기호로 구분된 짝수 및 홀수 위치의 문자 수가 포함됩니다. 인코딩된 문자열이 동일하면 두 문자열은 동일한 것으로 간주되고 그렇지 않으면 동일하지 않습니다. 문자열을 인코딩하는 방법이 있으면 문제는 인코딩된 개별 문자열을 계산하는 것으로 줄어듭니다. 이는 해싱의 전형적인 문제입니다. 우리는 해시 세트를 생성하고 문자열의 인코딩을 하나씩 저장합니다. 인코딩이 이미 존재하는 경우 문자열을 무시합니다. 그렇지 않으면 인코딩을 해시로 저장하고 고유 문자열의 개수를 늘립니다. 

구현:

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>   

산출
4 

시간 복잡도 : 에) 
보조공간 : O(1)

 

퀴즈 만들기