使用 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 的标准逻辑可能令人困惑
// 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 的标准逻辑可能令人困惑