logo

Verschillende tekenreeksen met oneven en even wijzigingen zijn toegestaan

Gegeven een array van kleine letters, is het de taak om het aantal strings te vinden dat verschillend is. Twee strings zijn van elkaar te onderscheiden als bij het toepassen van de volgende bewerkingen op één string de tweede string niet kan worden gevormd.  

  • Een teken op de oneven index kan alleen worden verwisseld met een ander teken op de oneven index.
  • Een teken op de even index kan alleen worden verwisseld met een ander teken op de even index.

Voorbeelden:   

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 eenvoudige oplossing is om twee lussen uit te voeren. De buitenste lus kiest een string en de binnenste lus controleert of er een eerdere string is die kan worden geconverteerd naar een huidige string door toegestane transformaties uit te voeren. Deze oplossing vereist O(n2m) tijd waarbij n het aantal tekenreeksen is en m het maximale aantal tekens in een tekenreeks.



Een efficiënte oplossing genereert een gecodeerde string voor elke invoerstring. De gecodeerde versie bevat tellingen van even en oneven gepositioneerde tekens, gescheiden door een scheidingsteken. Twee strings worden als hetzelfde beschouwd als hun gecodeerde strings hetzelfde zijn, anders niet. Zodra we een manier hebben om strings te coderen, wordt het probleem gereduceerd tot het tellen van verschillende gecodeerde strings. Dit is een typisch probleem bij hashing. We maken een hashset en slaan de coderingen van strings één voor één op. Als er al een codering bestaat, negeren we de string. Anders slaan we de codering op in hash en verhogen we het aantal afzonderlijke tekenreeksen. 

Uitvoering:

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(hashEven0sizeof(hashEven));  memset(hashOdd0sizeof(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_arrayinput[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> 

Uitvoer
4

Tijdcomplexiteit : Op) 
Hulpruimte: O(1)

 

Quiz maken