Coppie di corde complete in due set di corde
Due stringhe si dicono complete se concatenate contengono tutti i 26 alfabeti inglesi. Ad esempio, "abcdefghi" e "jklmnopqrstuvwxyz" sono completi poiché insieme contengono tutti i caratteri dalla "a" alla "z".
Ci vengono dati due insiemi di dimensioni n e m rispettivamente e dobbiamo trovare il numero di coppie complete concatenando ciascuna stringa dell'insieme 1 con ciascuna stringa dell'insieme 2.
Input : set1[] = {'abcdefgh' 'geeksforgeeks' 'lmnopqrst' 'abc'} set2[] = {'ijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz' 'defghijklmnopqrstuvwxyz'} Output : 7 The total complete pairs that are forming are: 'abcdefghijklmnopqrstuvwxyz' 'abcdefghabcdefghijklmnopqrstuvwxyz' 'abcdefghdefghijklmnopqrstuvwxyz' 'geeksforgeeksabcdefghijklmnopqrstuvwxyz' 'lmnopqrstabcdefghijklmnopqrstuvwxyz' 'abcabcdefghijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz' Metodo 1 (metodo ingenuo): Una soluzione semplice è considerare tutte le coppie di stringhe concatenarle e quindi verificare se la stringa concatenata contiene tutti i caratteri da "a" a "z" utilizzando un array di frequenze.
Attuazione:
C++ // C++ implementation for find pairs of complete // strings. #include using namespace std ; // Returns count of complete pairs from set[0..n-1] // and set2[0..m-1] int countCompletePairs ( string set1 [] string set2 [] int n int m ) { int result = 0 ; // Consider all pairs of both strings for ( int i = 0 ; i < n ; i ++ ) { for ( int j = 0 ; j < m ; j ++ ) { // Create a concatenation of current pair string concat = set1 [ i ] + set2 [ j ]; // Compute frequencies of all characters // in the concatenated string. int frequency [ 26 ] = { 0 }; for ( int k = 0 ; k < concat . length (); k ++ ) frequency [ concat [ k ] - 'a' ] ++ ; // If frequency of any character is not // greater than 0 then this pair is not // complete. int i ; for ( i = 0 ; i < 26 ; i ++ ) if ( frequency [ i ] < 1 ) break ; if ( i == 26 ) result ++ ; } } return result ; } // Driver code int main () { string set1 [] = { 'abcdefgh' 'geeksforgeeks' 'lmnopqrst' 'abc' }; string set2 [] = { 'ijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz' 'defghijklmnopqrstuvwxyz' }; int n = sizeof ( set1 ) / sizeof ( set1 [ 0 ]); int m = sizeof ( set2 ) / sizeof ( set2 [ 0 ]); cout < < countCompletePairs ( set1 set2 n m ); return 0 ; }
Java // Java implementation for find pairs of complete // strings. class GFG { // Returns count of complete pairs from set[0..n-1] // and set2[0..m-1] static int countCompletePairs ( String set1 [] String set2 [] int n int m ) { int result = 0 ; // Consider all pairs of both strings for ( int i = 0 ; i < n ; i ++ ) { for ( int j = 0 ; j < m ; j ++ ) { // Create a concatenation of current pair String concat = set1 [ i ] + set2 [ j ] ; // Compute frequencies of all characters // in the concatenated String. int frequency [] = new int [ 26 ] ; for ( int k = 0 ; k < concat . length (); k ++ ) { frequency [ concat . charAt ( k ) - 'a' ]++ ; } // If frequency of any character is not // greater than 0 then this pair is not // complete. int k ; for ( k = 0 ; k < 26 ; k ++ ) { if ( frequency [ k ] < 1 ) { break ; } } if ( k == 26 ) { result ++ ; } } } return result ; } // Driver code static public void main ( String [] args ) { String set1 [] = { 'abcdefgh' 'geeksforgeeks' 'lmnopqrst' 'abc' }; String set2 [] = { 'ijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz' 'defghijklmnopqrstuvwxyz' }; int n = set1 . length ; int m = set2 . length ; System . out . println ( countCompletePairs ( set1 set2 n m )); } } // This code is contributed by PrinciRaj19992
Python3 # Python3 implementation for find pairs of complete # strings. # Returns count of complete pairs from set[0..n-1] # and set2[0..m-1] def countCompletePairs ( set1 set2 n m ): result = 0 # Consider all pairs of both strings for i in range ( n ): for j in range ( m ): # Create a concatenation of current pair concat = set1 [ i ] + set2 [ j ] # Compute frequencies of all characters # in the concatenated String. frequency = [ 0 for i in range ( 26 )] for k in range ( len ( concat )): frequency [ ord ( concat [ k ]) - ord ( 'a' )] += 1 # If frequency of any character is not # greater than 0 then this pair is not # complete. k = 0 while ( k < 26 ): if ( frequency [ k ] < 1 ): break k += 1 if ( k == 26 ): result += 1 return result # Driver code set1 = [ 'abcdefgh' 'geeksforgeeks' 'lmnopqrst' 'abc' ] set2 = [ 'ijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz' 'defghijklmnopqrstuvwxyz' ] n = len ( set1 ) m = len ( set2 ) print ( countCompletePairs ( set1 set2 n m )) # This code is contributed by shinjanpatra
C# // C# implementation for find pairs of complete // strings. using System ; class GFG { // Returns count of complete pairs from set[0..n-1] // and set2[0..m-1] static int countCompletePairs ( string [] set1 string [] set2 int n int m ) { int result = 0 ; // Consider all pairs of both strings for ( int i = 0 ; i < n ; i ++ ) { for ( int j = 0 ; j < m ; j ++ ) { // Create a concatenation of current pair string concat = set1 [ i ] + set2 [ j ]; // Compute frequencies of all characters // in the concatenated String. int [] frequency = new int [ 26 ]; for ( int k = 0 ; k < concat . Length ; k ++ ) { frequency [ concat [ k ] - 'a' ] ++ ; } // If frequency of any character is not // greater than 0 then this pair is not // complete. int l ; for ( l = 0 ; l < 26 ; l ++ ) { if ( frequency [ l ] < 1 ) { break ; } } if ( l == 26 ) { result ++ ; } } } return result ; } // Driver code static public void Main () { string [] set1 = { 'abcdefgh' 'geeksforgeeks' 'lmnopqrst' 'abc' }; string [] set2 = { 'ijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz' 'defghijklmnopqrstuvwxyz' }; int n = set1 . Length ; int m = set2 . Length ; Console . Write ( countCompletePairs ( set1 set2 n m )); } } // This article is contributed by Ita_c.
JavaScript < script > // Javascript implementation for find pairs of complete // strings. // Returns count of complete pairs from set[0..n-1] // and set2[0..m-1] function countCompletePairs ( set1 set2 n m ) { let result = 0 ; // Consider all pairs of both strings for ( let i = 0 ; i < n ; i ++ ) { for ( let j = 0 ; j < m ; j ++ ) { // Create a concatenation of current pair let concat = set1 [ i ] + set2 [ j ]; // Compute frequencies of all characters // in the concatenated String. let frequency = new Array ( 26 ); for ( let i = 0 ; i < 26 ; i ++ ) { frequency [ i ] = 0 ; } for ( let k = 0 ; k < concat . length ; k ++ ) { frequency [ concat [ k ]. charCodeAt ( 0 ) - 'a' . charCodeAt ( 0 )] ++ ; } // If frequency of any character is not // greater than 0 then this pair is not // complete. let k ; for ( k = 0 ; k < 26 ; k ++ ) { if ( frequency [ k ] < 1 ) { break ; } } if ( k == 26 ) { result ++ ; } } } return result ; } // Driver code let set1 = [ 'abcdefgh' 'geeksforgeeks' 'lmnopqrst' 'abc' ]; let set2 = [ 'ijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz' 'defghijklmnopqrstuvwxyz' ] let n = set1 . length ; let m = set2 . length ; document . write ( countCompletePairs ( set1 set2 n m )); // This code is contributed by avanitrachhadiya2155 < /script>
Produzione
7
Complessità temporale: O(n * m * k)
Spazio ausiliario: O(1)
Metodo 2 (metodo ottimizzato utilizzando la manipolazione dei bit): In questo metodo comprimiamo l'array di frequenza in un numero intero. Assegniamo a ciascun bit di quell'intero un carattere e lo impostiamo a 1 quando il carattere viene trovato. Eseguiamo questa operazione per tutte le corde di entrambi i set. Alla fine confrontiamo semplicemente i due interi negli insiemi e se combinando tutti i bit vengono impostati formano una coppia di stringhe completa.
Attuazione:
C++14 // C++ program to find count of complete pairs #include using namespace std ; // Returns count of complete pairs from set[0..n-1] // and set2[0..m-1] int countCompletePairs ( string set1 [] string set2 [] int n int m ) { int result = 0 ; // con_s1[i] is going to store an integer whose // set bits represent presence/absence of characters // in string set1[i]. // Similarly con_s2[i] is going to store an integer // whose set bits represent presence/absence of // characters in string set2[i] int con_s1 [ n ] con_s2 [ m ]; // Process all strings in set1[] for ( int i = 0 ; i < n ; i ++ ) { // initializing all bits to 0 con_s1 [ i ] = 0 ; for ( int j = 0 ; j < set1 [ i ]. length (); j ++ ) { // Setting the ascii code of char s[i][j] // to 1 in the compressed integer. con_s1 [ i ] = con_s1 [ i ] | ( 1 < < ( set1 [ i ][ j ] - 'a' )); } } // Process all strings in set2[] for ( int i = 0 ; i < m ; i ++ ) { // initializing all bits to 0 con_s2 [ i ] = 0 ; for ( int j = 0 ; j < set2 [ i ]. length (); j ++ ) { // setting the ascii code of char s[i][j] // to 1 in the compressed integer. con_s2 [ i ] = con_s2 [ i ] | ( 1 < < ( set2 [ i ][ j ] - 'a' )); } } // assigning a variable whose all 26 (0..25) // bits are set to 1 long long complete = ( 1 < < 26 ) - 1 ; // Now consider every pair of integer in con_s1[] // and con_s2[] and check if the pair is complete. for ( int i = 0 ; i < n ; i ++ ) { for ( int j = 0 ; j < m ; j ++ ) { // if all bits are set the strings are // complete! if (( con_s1 [ i ] | con_s2 [ j ]) == complete ) result ++ ; } } return result ; } // Driver code int main () { string set1 [] = { 'abcdefgh' 'geeksforgeeks' 'lmnopqrst' 'abc' }; string set2 [] = { 'ijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz' 'defghijklmnopqrstuvwxyz' }; int n = sizeof ( set1 ) / sizeof ( set1 [ 0 ]); int m = sizeof ( set2 ) / sizeof ( set2 [ 0 ]); cout < < countCompletePairs ( set1 set2 n m ); return 0 ; }
Java // Java program to find count of complete pairs class GFG { // Returns count of complete pairs from set[0..n-1] // and set2[0..m-1] static int countCompletePairs ( String set1 [] String set2 [] int n int m ) { int result = 0 ; // con_s1[i] is going to store an integer whose // set bits represent presence/absence of characters // in string set1[i]. // Similarly con_s2[i] is going to store an integer // whose set bits represent presence/absence of // characters in string set2[i] int [] con_s1 = new int [ n ] ; int [] con_s2 = new int [ m ] ; // Process all strings in set1[] for ( int i = 0 ; i < n ; i ++ ) { // initializing all bits to 0 con_s1 [ i ] = 0 ; for ( int j = 0 ; j < set1 [ i ] . length (); j ++ ) { // Setting the ascii code of char s[i][j] // to 1 in the compressed integer. con_s1 [ i ] = con_s1 [ i ] | ( 1 < < ( set1 [ i ] . charAt ( j ) - 'a' )); } } // Process all strings in set2[] for ( int i = 0 ; i < m ; i ++ ) { // initializing all bits to 0 con_s2 [ i ] = 0 ; for ( int j = 0 ; j < set2 [ i ] . length (); j ++ ) { // setting the ascii code of char s[i][j] // to 1 in the compressed integer. con_s2 [ i ] = con_s2 [ i ] | ( 1 < < ( set2 [ i ] . charAt ( j ) - 'a' )); } } // assigning a variable whose all 26 (0..25) // bits are set to 1 long complete = ( 1 < < 26 ) - 1 ; // Now consider every pair of integer in con_s1[] // and con_s2[] and check if the pair is complete. for ( int i = 0 ; i < n ; i ++ ) { for ( int j = 0 ; j < m ; j ++ ) { // if all bits are set the strings are // complete! if (( con_s1 [ i ] | con_s2 [ j ] ) == complete ) { result ++ ; } } } return result ; } // Driver code public static void main ( String args [] ) { String set1 [] = { 'abcdefgh' 'geeksforgeeks' 'lmnopqrst' 'abc' }; String set2 [] = { 'ijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz' 'defghijklmnopqrstuvwxyz' }; int n = set1 . length ; int m = set2 . length ; System . out . println ( countCompletePairs ( set1 set2 n m )); } } // This code contributed by Rajput-Ji
C# // C# program to find count of complete pairs using System ; class GFG { // Returns count of complete pairs from set[0..n-1] // and set2[0..m-1] static int countCompletePairs ( String [] set1 String [] set2 int n int m ) { int result = 0 ; // con_s1[i] is going to store an integer whose // set bits represent presence/absence of characters // in string set1[i]. // Similarly con_s2[i] is going to store an integer // whose set bits represent presence/absence of // characters in string set2[i] int [] con_s1 = new int [ n ]; int [] con_s2 = new int [ m ]; // Process all strings in set1[] for ( int i = 0 ; i < n ; i ++ ) { // initializing all bits to 0 con_s1 [ i ] = 0 ; for ( int j = 0 ; j < set1 [ i ]. Length ; j ++ ) { // Setting the ascii code of char s[i][j] // to 1 in the compressed integer. con_s1 [ i ] = con_s1 [ i ] | ( 1 < < ( set1 [ i ][ j ] - 'a' )); } } // Process all strings in set2[] for ( int i = 0 ; i < m ; i ++ ) { // initializing all bits to 0 con_s2 [ i ] = 0 ; for ( int j = 0 ; j < set2 [ i ]. Length ; j ++ ) { // setting the ascii code of char s[i][j] // to 1 in the compressed integer. con_s2 [ i ] = con_s2 [ i ] | ( 1 < < ( set2 [ i ][ j ] - 'a' )); } } // assigning a variable whose all 26 (0..25) // bits are set to 1 long complete = ( 1 < < 26 ) - 1 ; // Now consider every pair of integer in con_s1[] // and con_s2[] and check if the pair is complete. for ( int i = 0 ; i < n ; i ++ ) { for ( int j = 0 ; j < m ; j ++ ) { // if all bits are set the strings are // complete! if (( con_s1 [ i ] | con_s2 [ j ]) == complete ) { result ++ ; } } } return result ; } // Driver code public static void Main ( String [] args ) { String [] set1 = { 'abcdefgh' 'geeksforgeeks' 'lmnopqrst' 'abc' }; String [] set2 = { 'ijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz' 'defghijklmnopqrstuvwxyz' }; int n = set1 . Length ; int m = set2 . Length ; Console . WriteLine ( countCompletePairs ( set1 set2 n m )); } } // This code has been contributed by 29AjayKumar
Python3 # Python3 program to find count of complete pairs # Returns count of complete pairs from set[0..n-1] # and set2[0..m-1] def countCompletePairs ( set1 set2 n m ): result = 0 # con_s1[i] is going to store an integer whose # set bits represent presence/absence of characters # in set1[i]. # Similarly con_s2[i] is going to store an integer # whose set bits represent presence/absence of # characters in set2[i] con_s1 con_s2 = [ 0 ] * n [ 0 ] * m # Process all strings in set1[] for i in range ( n ): # initializing all bits to 0 con_s1 [ i ] = 0 for j in range ( len ( set1 [ i ])): # Setting the ascii code of char s[i][j] # to 1 in the compressed integer. con_s1 [ i ] = con_s1 [ i ] | ( 1 < < ( ord ( set1 [ i ][ j ]) - ord ( 'a' ))) # Process all strings in set2[] for i in range ( m ): # initializing all bits to 0 con_s2 [ i ] = 0 for j in range ( len ( set2 [ i ])): # setting the ascii code of char s[i][j] # to 1 in the compressed integer. con_s2 [ i ] = con_s2 [ i ] | ( 1 < < ( ord ( set2 [ i ][ j ]) - ord ( 'a' ))) # assigning a variable whose all 26 (0..25) # bits are set to 1 complete = ( 1 < < 26 ) - 1 # Now consider every pair of integer in con_s1[] # and con_s2[] and check if the pair is complete. for i in range ( n ): for j in range ( m ): # if all bits are set the strings are # complete! if (( con_s1 [ i ] | con_s2 [ j ]) == complete ): result += 1 return result # Driver code if __name__ == '__main__' : set1 = [ 'abcdefgh' 'geeksforgeeks' 'lmnopqrst' 'abc' ] set2 = [ 'ijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz' 'defghijklmnopqrstuvwxyz' ] n = len ( set1 ) m = len ( set2 ) print ( countCompletePairs ( set1 set2 n m )) # This code is contributed by mohit kumar 29
JavaScript < script > // Javascript program to find count of complete pairs // Returns count of complete pairs from set[0..n-1] // and set2[0..m-1] function countCompletePairs ( set1 set2 n m ) { let result = 0 ; // con_s1[i] is going to store an integer whose // set bits represent presence/absence of characters // in string set1[i]. // Similarly con_s2[i] is going to store an integer // whose set bits represent presence/absence of // characters in string set2[i] let con_s1 = new Array ( n ); let con_s2 = new Array ( m ); // Process all strings in set1[] for ( let i = 0 ; i < n ; i ++ ) { // initializing all bits to 0 con_s1 [ i ] = 0 ; for ( let j = 0 ; j < set1 [ i ]. length ; j ++ ) { // Setting the ascii code of char s[i][j] // to 1 in the compressed integer. con_s1 [ i ] = con_s1 [ i ] | ( 1 < < ( set1 [ i ][ j ]. charCodeAt ( 0 ) - 'a' . charCodeAt ( 0 ))); } } // Process all strings in set2[] for ( let i = 0 ; i < m ; i ++ ) { // initializing all bits to 0 con_s2 [ i ] = 0 ; for ( let j = 0 ; j < set2 [ i ]. length ; j ++ ) { // setting the ascii code of char s[i][j] // to 1 in the compressed integer. con_s2 [ i ] = con_s2 [ i ] | ( 1 < < ( set2 [ i ][ j ]. charCodeAt ( 0 ) - 'a' . charCodeAt ( 0 ))); } } // assigning a variable whose all 26 (0..25) // bits are set to 1 let complete = ( 1 < < 26 ) - 1 ; // Now consider every pair of integer in con_s1[] // and con_s2[] and check if the pair is complete. for ( let i = 0 ; i < n ; i ++ ) { for ( let j = 0 ; j < m ; j ++ ) { // if all bits are set the strings are // complete! if (( con_s1 [ i ] | con_s2 [ j ]) == complete ) { result ++ ; } } } return result ; } // Driver code let set1 = [ 'abcdefgh' 'geeksforgeeks' 'lmnopqrst' 'abc' ]; let set2 = [ 'ijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz' 'defghijklmnopqrstuvwxyz' ] let n = set1 . length ; let m = set2 . length ; document . write ( countCompletePairs ( set1 set2 n m )); // This code is contributed by avanitrachhadiya2155 < /script>
Produzione
7
Complessità temporale: O(n*m) dove n è la dimensione del primo insieme e m è la dimensione del secondo insieme.
Spazio ausiliario: SU)
Questo articolo è stato fornito da Rishabh Jain .