给定一个字符串数组arr [] 。任务是查找无序的字符串对(arr [i],arr [j])的计数,这些字符串在串联时至少包含一次字符串“字符串 ”的每个字符。
例子:
Input: arr[] = { “s”, “ng”, “stri”}
Output: 1
(arr[1], arr[2]) is the only pair which on concatenation
will contain every character of the string “string”
i.e. arr[1] + arr[2] = “ngstri”
Input: arr[] = { “stri”, “ing”, “string” }
Output: 3
方法:将给定的字符串存储为位掩码,即,由于缺少“ t”和“ g” ,因此字符串“ srin”将被存储为101110 ,因此它们的对应位将为0 。现在,创建一个大小为64的数组,该数组是所获得的位掩码的最大可能值(0(000000)到63(111111)) 。现在,问题减少到找到这些位掩码的成对计数,这些成对的掩码给出了63(二进制为111111)作为其OR值。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
#define MAX 64
// Function to return the bitmask for the string
int getBitmask(string s)
{
int temp = 0;
for (int j = 0; j < s.length(); j++) {
if (s[j] == 's') {
temp = temp | (1);
}
else if (s[j] == 't') {
temp = temp | (2);
}
else if (s[j] == 'r') {
temp = temp | (4);
}
else if (s[j] == 'i') {
temp = temp | (8);
}
else if (s[j] == 'n') {
temp = temp | (16);
}
else if (s[j] == 'g') {
temp = temp | (32);
}
}
return temp;
}
// Function to return the count of pairs
int countPairs(string arr[], int n)
{
// bitMask[i] will store the count of strings
// from the array whose bitmask is i
int bitMask[MAX] = { 0 };
for (int i = 0; i < n; i++)
bitMask[getBitmask(arr[i])]++;
// To store the count of pairs
int cnt = 0;
for (int i = 0; i < MAX; i++) {
for (int j = i; j < MAX; j++) {
// MAX - 1 = 63 i.e. 111111 in binary
if ((i | j) == (MAX - 1)) {
// arr[i] cannot make s pair with itself
// i.e. (arr[i], arr[i])
if (i == j)
cnt += ((bitMask[i] * bitMask[i] - 1) / 2);
else
cnt += (bitMask[i] * bitMask[j]);
}
}
}
return cnt;
}
// Driver code
int main()
{
string arr[] = { "strrr", "strring", "gstrin" };
int n = sizeof(arr) / sizeof(arr[0]);
cout << countPairs(arr, n);
return 0;
}
Java
// Java implementation of the
// above approach
class GFG
{
static int MAX = 64;
// Function to return the bitmask for the string
static int getBitmask(char[] s)
{
int temp = 0;
for (int j = 0; j < s.length; j++)
{
switch (s[j])
{
case 's':
temp = temp | (1);
break;
case 't':
temp = temp | (2);
break;
case 'r':
temp = temp | (4);
break;
case 'i':
temp = temp | (8);
break;
case 'n':
temp = temp | (16);
break;
case 'g':
temp = temp | (32);
break;
default:
break;
}
}
return temp;
}
// Function to return the count of pairs
static int countPairs(String arr[], int n)
{
// bitMask[i] will store the count of strings
// from the array whose bitmask is i
int []bitMask = new int[MAX];
for (int i = 0; i < n; i++)
bitMask[getBitmask(arr[i].toCharArray())]++;
// To store the count of pairs
int cnt = 0;
for (int i = 0; i < MAX; i++)
{
for (int j = i; j < MAX; j++)
{
// MAX - 1 = 63 i.e. 111111 in binary
if ((i | j) == (MAX - 1))
{
// arr[i] cannot make s pair with itself
// i.e. (arr[i], arr[i])
if (i == j)
cnt += ((bitMask[i] * bitMask[i] - 1) / 2);
else
cnt += (bitMask[i] * bitMask[j]);
}
}
}
return cnt;
}
// Driver code
public static void main(String[] args)
{
String arr[] = { "strrr", "strring", "gstrin" };
int n = arr.length;
System.out.println(countPairs(arr, n));
}
}
/* This code contributed by PrinciRaj1992 */
Python3
# Python3 implementation of the approach
MAX = 64
# Function to return the bitmask
# for the string
def getBitmask(s):
temp = 0
for j in range(len(s)):
if (s[j] == 's'):
temp = temp | 1
elif (s[j] == 't'):
temp = temp | 2
elif (s[j] == 'r'):
temp = temp | 4
elif (s[j] == 'i'):
temp = temp | 8
elif (s[j] == 'n'):
temp = temp | 16
elif (s[j] == 'g'):
temp = temp | 32
return temp
# Function to return the count of pairs
def countPairs(arr, n):
# bitMask[i] will store the count of strings
# from the array whose bitmask is i
bitMask = [0 for i in range(MAX)]
for i in range(n):
bitMask[getBitmask(arr[i])] += 1
# To store the count of pairs
cnt = 0
for i in range(MAX):
for j in range(i, MAX):
# MAX - 1 = 63 i.e. 111111 in binary
if ((i | j) == (MAX - 1)):
# arr[i] cannot make s pair with itself
# i.e. (arr[i], arr[i])
if (i == j):
cnt += ((bitMask[i] *
bitMask[i] - 1) // 2)
else:
cnt += (bitMask[i] * bitMask[j])
return cnt
# Driver code
arr = ["strrr", "strring", "gstrin"]
n = len(arr)
print(countPairs(arr, n))
# This code is contributed by mohit kumar
C#
// C# implementation of the
// above approach
using System;
using System.Collections.Generic;
class GFG
{
static int MAX = 64;
// Function to return the bitmask for the string
static int getBitmask(char[] s)
{
int temp = 0;
for (int j = 0; j < s.Length; j++)
{
switch (s[j])
{
case 's':
temp = temp | (1);
break;
case 't':
temp = temp | (2);
break;
case 'r':
temp = temp | (4);
break;
case 'i':
temp = temp | (8);
break;
case 'n':
temp = temp | (16);
break;
case 'g':
temp = temp | (32);
break;
default:
break;
}
}
return temp;
}
// Function to return the count of pairs
static int countPairs(String []arr, int n)
{
// bitMask[i] will store the count of strings
// from the array whose bitmask is i
int []bitMask = new int[MAX];
for (int i = 0; i < n; i++)
bitMask[getBitmask(arr[i].ToCharArray())]++;
// To store the count of pairs
int cnt = 0;
for (int i = 0; i < MAX; i++)
{
for (int j = i; j < MAX; j++)
{
// MAX - 1 = 63 i.e. 111111 in binary
if ((i | j) == (MAX - 1))
{
// arr[i] cannot make s pair with itself
// i.e. (arr[i], arr[i])
if (i == j)
cnt += ((bitMask[i] * bitMask[i] - 1) / 2);
else
cnt += (bitMask[i] * bitMask[j]);
}
}
}
return cnt;
}
// Driver code
public static void Main(String[] args)
{
String []arr = { "strrr", "strring", "gstrin" };
int n = arr.Length;
Console.WriteLine(countPairs(arr, n));
}
}
// This code has been contributed by 29AjayKumar
PHP
输出:
3
如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。