Разумно предположить, что набор символов небольшой и конечный по сравнению с потенциальной длиной строки. Так, например, обработка 8-битных символов (в псевдокоде примерно на C ++):
bool in_a[256] = { false };
bool in_b[256] = { false };
for (int i = 0; i < a.size(); ++i)
in_a[a[i]] = true;
for (int i = 0; i < b.size(); ++i)
in_b[b[i]] = true;
// and in_a and in_b
for (int i = 0; i < b.size(); ++i)
if (in_a[i] && in_b[i])
{
std::cout << i;
if (isprint(i)) std::cout << '\'' << (char)i << '\'';
std::cout << ' ';
}
std::cout << '\n';
Обратите внимание, что использование хеш-таблицы, а не массива, - огромная трата времени (если не обрабатывать, скажем, 32-битное символьное представление).
Ниже следует реализация упрощения, предложенного в комментарии Йордана. Это позволяет избежать последнего цикла с 0..255 и требует только один массив отслеживания. Порядок результатов не отсортирован.
#include <vector>
#include <iostream>
int main()
{
std::string a = "abdcdefg";
std::string b = "byfdz";
bool track[256] = { false };
for (int i = 0; i < a.size(); ++i)
track[a[i]] = true;
for (int i = 0; i < b.size(); ++i)
if (track[b[i]])
{
track[b[i]] = false; // don't match again
std::cout << (int)b[i];
if (isprint(b[i])) std::cout << " \'" << (char)(b[i]) << "\'";
std::cout << ' ';
}
std::cout << '\n';
}