📌  相关文章
📜  成对的字符串在连接中包含“ 字符串 ”的每个字符

📅  最后修改于: 2021-04-29 08:15:10             🧑  作者: Mango

给定一个字符串数组arr [] 。任务是查找无序的字符串对(arr [i],arr [j])的计数,这些字符串在串联时至少包含一次字符串“字符串 ”的每个字符。

例子:

方法:将给定的字符串存储为位掩码,即,由于缺少“ 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