Нахождение общих символов двух строк
Была задача написать программу, которая находит все символы, встречающиеся в обеих переданных ей строках. Реализовал через multiset, по идее все должно работать, однако проходит не все тесты и тест дающий ошибку придумать не могу.
Вот задача: Напишите программу, которая находит все символы, встречающиеся в обеих переданных ей строках.
Входные данные На вход программы подаются две символьные строки, каждая строка завершается символом "конец строки".
Выходные данные Программа должна вывести все символы, которые встречаются в обеих строках, в порядке возрастания их ASCII-кодов. Если таких символов нет, нужно вывести слово 'NO'. Вот сам код:
#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <iterator>
int main()
{
std::string s1, s2; std::cin >> s1 >> s2;
std::multiset<char> a, b;
std::multiset<char> intersection;
for (int i = 0; i < s1.length(); ++i)
{
a.insert(s1[i]);
}
for (int i = 0; i < s2.length(); ++i)
{
b.insert(s2[i]);
}
std::set_intersection(a.begin(), a.end(), b.begin(), b.end(), std::inserter(intersection, intersection.begin()));
if (intersection.size() != 0)
{
for (char i : intersection)
{
std::cout << i;
}
}
else std::cout << "NO";
system("pause");
return 0;
}
Ответы (2 шт):
Используйте функции_члены std::string :
size_t pos = s1.find_first_of(s2);
while ( pos < s1.size()) {
cout << s1[pos] << ' ';
pos = s1.find_first_of(s2, pos + 1);
}
с помощью сета:
set<char> s(s1.begin(), s1.end());
for (char c : s2) {
if (!s.emplace(c).second)
cout << c << ' ';
}
Ну, я бы делал так:
int main()
{
string s;
getline(cin,s);
set<char> a(s.begin(),s.end());
getline(cin,s);
set<char> b(s.begin(),s.end());
set_intersection(a.begin(), a.end(),
b.begin(), b.end(),
ostream_iterator<char>(cout, " "));
cout << "\n";
}
А, да, если ничего нет - то нужно же выводить NO - ну, думаю, тут вы допишете сами?..