使用 memset() 和 memcpy() 函数

using memset() and memcpy() function

// CPP Program to find all the common characters 
// in n strings 
#include <bits/stdc++.h> 
using namespace std; 

const int MAX_CHAR = 26; 

void commonCharacters(string str[], int n) 
{ 
  // primary array for common characters 
  // we assume all characters are seen before. 
  bool prim[MAX_CHAR] = {true}; 
  //memset(prim, true, sizeof(prim)); 

  // for each string 
  for (int i = 0; i < n; i++) { 

    // secondary array for common characters 
    // Initially marked false 
    bool sec[MAX_CHAR] = { false }; 

    // for every character of ith string 
    for (int j = 0; str[i][j]; j++) { 

      // if character is present in all 
      // strings before, mark it. 
      if (prim[str[i][j] - 'a']) 
        sec[str[i][j] - 'a'] = true; 
    } 

    // copy whole secondary array into primary 
    //memcpy(prim, sec, MAX_CHAR); 

    for(int k=0;k<n;k++)
      prim[k] = sec[k];
  } 


  // displaying common characters 
  for (int i = 0; i < 26; i++) 
    if (prim[i]) 
      printf("%c ", i + 'a'); 
} 

// Driver's Code 
int main() 
{ 
  string str[] = { "geeksforgeeks", 
                   "gemkstones", 
                   "acknowledges", 
                   "aguelikes" }; 
  int n = sizeof(str)/sizeof(str[0]); 
  commonCharacters(str, n); 
  return 0; 
}

我们使用两个大小为 26 的哈希数组(对于 a-z,其中 0 是 a,z 是 25)。 方法很简单,如果我们之前见过一个字符,我们会标记它,如果我们没有然后忽略该字符,因为它不是一个常见的字符。 为什么此代码没有提供所需的输出?而如果我使用 memset(prim,true,sizeof(prim)) 而不是 bool prim[MAX_CHAR] = {true}; 进行初始化,使用 memcpy(prim,sec,MAX_CHAR) 而不是 for(int k=0;k<n;k++) prim[k] = sec[k]; 将布尔数组 sec[] 复制到 prim[] 中,它就可以正常工作。

警告

bool prim[MAX_CHAR] = {true}; 

不等同于memset(prim, true, sizeof(prim));

MAX_CHAR是26,而你只用{true}给1个值,所以prim[0]true初始化,所有25下一个条目初始化为 0 (false)。 true用到数组末尾

但是

bool prim[MAX_CHAR] = {true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true }

初始化26个条目(如果我算得好的话)

当然memcpy(prim,sec,MAX_CHAR)for(int k=0;k<n;k++) prim[k] = sec[k];是不等价的,因为n是字符串的个数(4)而不是值MAX_CHAR (26)

使用您的代码执行:

pi@raspberrypi:/tmp $ ./a.out
pi@raspberrypi:/tmp $

执行 memset{} 中的 26 true,并用 [=25 替换 for(int k=0;k<n;k++) =]:

pi@raspberrypi:/tmp $ ./a.out
e g k s pi@raspberrypi:/tmp $ 

François Andrieux 的提议(在下面删除的注释中)消除了有关 prim 初始化的问题:反转 prim[= 中的布尔值59=], 所以

void commonCharacters(string str[], int n) 
{ 
  // primary array for common characters 
  // we assume all characters are seen before. 
  // (false means seen before, reverse logic)
  bool prim[MAX_CHAR] = {false}; 

  // for each string 
  for (int i = 0; i < n; i++) { 

    // secondary array for common characters 
    // Initially marked false (standard logic)
    bool sec[MAX_CHAR] = { false }; 

    // for every character of ith string 
    for (int j = 0; str[i][j]; j++) { 

      // if character is present in all 
      // strings before, mark it. 
      if (!prim[str[i][j] - 'a']) 
        sec[str[i][j] - 'a'] = true; 
    } 

    // copy negation of whole secondary array into primary         
    for(int k=0; k<MAX_CHAR; k++)
      prim[k] = !sec[k];
  } 

  // displaying common characters 
  for (int i = 0; i < 26; i++) 
    if (!prim[i]) 
      printf("%c ", i + 'a'); 
} 

执行:

pi@raspberrypi:/tmp $ ./a.out
e g k s pi@raspberrypi:/tmp $ 

但是 prim 的反向逻辑和 sec 的标准逻辑可能令人困惑