Вы можете сделать:
#include <iostream>
#include <string>
int main() {
std::string s1 = "abbccdef";
std::string s2 = "abc";
for (std::string::size_type i = 0; i < s2.length(); ++i) {
for (std::string::size_type j = 0; j < s1.length(); ++j) {
if (s1[j] == s2[i]) {
s1.erase(j, 1);
break;
}
}
}
std::cout << s1 << std::endl;
}
Вывод:
# ./a.out
bcdef
EDIT
OP изменил вопрос и теперь ищет оптимальное решение этой проблемы.
Решение:
- Запишите количество вхождений символов строки2 в массив.
- Разберите строку1 и, если символ найден в массиве, уменьшите его количество и удалите его из строки 1.
Предположим, что размер строки 1 равен n
, а размер строки 2 равен m
, тогда сложность этого решения составляет O(n+m)
, поскольку обе строки анализируются только один раз.
#include <iostream>
#include <string>
#include <vector>
int main() {
std::string s1 = "abbccdef";
std::string s2 = "abc";
std::vector<int> count(128, 0);
for (std::string::size_type i = 0; i < s2.length(); ++i) {
++count[s2[i]];
}
std::string::size_type j = 0;
while (j < s1.length()) {
if (count[s1[j]] != 0) {
--count[s1[j]];
s1.erase(j, 1);
continue;
}
++j;
}
std::cout << s1 << std::endl;
return 0;
}
Вывод:
# ./a.out
bcdef