Заданы z и y - две последовательности. Можно ли получить последовательность z вычеркиванием элементов из y.
Есть алгоритм решение. Помогите, пожалуйста, с написанием кода.
Пусть z есть массив из N элементов, y - из M. Положим i=1 и j=1. Берем элемент z[i] и ищем минимальное k, k>=j, k<=M, такое что y[k]=z[i] (мы находим очередной совпадающий символ в строках z и y). Полагаем i=i+1 и j=k+1. Повторяем поиск элемента z[i] в оставшемся куске последовательности y. Условия окончания поиска: a) Если i стало больше N (т.е. все элементы массива z являются подпоследовательностью элементов y), - и тогда z можно получить вычеркиванием элементов из y. б) Если в оставшимся куске последовательности y не найдено элемента, совпадающего с очередным z[i], то z из y получить нельзя.
C/C++
Код для программы на C++
#include <algorithm>
#include <iostream>
#include <vector>
#include <random>
using namespace std;
size_t length(const char* msg) {
cout << msg;
size_t value;
cin >> value;
return value;
}
void fill(vector<int>& box) {
uniform_int_distribution<> uid(1, 9);
mt19937 gen{ random_device()() };
for (auto& x : box) x = uid(gen);
}
void show(const vector<int>& box) {
for (auto& x : box) cout << x << ' ';
puts("");
}
vector<int> intersection(const vector<int>& a, const vector<int>& b) {
auto ta = a;
sort(ta.begin(), ta.end());
auto tb = b;
sort(tb.begin(), tb.end());
vector<int> box;
set_intersection(ta.begin(), ta.end(), tb.begin(), tb.end(), back_insert_iterator(box));
return box;
}
bool equals(const vector<int>& a, const vector<int>& b) {
auto ta = a;
sort(ta.begin(), ta.end());
auto tb = b;
sort(tb.begin(), tb.end());
return ta == tb;
}
int main() {
auto n = length("N: ");
vector<int> z(n);
fill(z);
auto m = length("M: ");
vector<int> y(m);
fill(y);
auto box = intersection(z, y);
show(z);
show(y);
puts(equals(z, box) ? "TRUE" : "FALSE");
}
#include <iostream>
#include <vector>
#include <random>
using namespace std;
size_t length(const char* msg) {
cout << msg;
size_t value;
cin >> value;
return value;
}
void fill(vector<int>& box) {
uniform_int_distribution<> uid(1, 9);
mt19937 gen{ random_device()() };
for (auto& x : box) x = uid(gen);
}
void show(const vector<int>& box) {
for (auto& x : box) cout << x << ' ';
puts("");
}
vector<int> intersection(const vector<int>& a, const vector<int>& b) {
auto ta = a;
sort(ta.begin(), ta.end());
auto tb = b;
sort(tb.begin(), tb.end());
vector<int> box;
set_intersection(ta.begin(), ta.end(), tb.begin(), tb.end(), back_insert_iterator(box));
return box;
}
bool equals(const vector<int>& a, const vector<int>& b) {
auto ta = a;
sort(ta.begin(), ta.end());
auto tb = b;
sort(tb.begin(), tb.end());
return ta == tb;
}
int main() {
auto n = length("N: ");
vector<int> z(n);
fill(z);
auto m = length("M: ");
vector<int> y(m);
fill(y);
auto box = intersection(z, y);
show(z);
show(y);
puts(equals(z, box) ? "TRUE" : "FALSE");
}
#include <iostream>
using namespace std;
int main()
{
int z[]{ 1,2,6,7,3,5,9,3,10,13 };
int y[]{ 2,13,3,10,7,6,9,1,3,5 };
size_t k = 0, i = 0;
size_t N = sizeof(z) / sizeof(int);
size_t M = sizeof(y) / sizeof(int);
do
{
while (z[i] != y[k] && k < M)k++;
if (k == M) {
cout << "No!"; return 0;
}
swap(y[k], y[i]);
i++; k = i;
} while (i != N);
cout << "Yes!";
}
Вариант n2:
#include <iostream>
#include <set>
using namespace std;
int main()
{
int z[]{ 1,2,6,7,3,5,9,3,10,13 };
int y[]{ 2,13,3,10,7,6,9,1,3,5 };
multiset<int>zz(z,end(z)), yy(y,end(y));
cout << (zz == yy ? "Yes!" : "No!");
}
using namespace std;
int main()
{
int z[]{ 1,2,6,7,3,5,9,3,10,13 };
int y[]{ 2,13,3,10,7,6,9,1,3,5 };
size_t k = 0, i = 0;
size_t N = sizeof(z) / sizeof(int);
size_t M = sizeof(y) / sizeof(int);
do
{
while (z[i] != y[k] && k < M)k++;
if (k == M) {
cout << "No!"; return 0;
}
swap(y[k], y[i]);
i++; k = i;
} while (i != N);
cout << "Yes!";
}
Вариант n2:
#include <iostream>
#include <set>
using namespace std;
int main()
{
int z[]{ 1,2,6,7,3,5,9,3,10,13 };
int y[]{ 2,13,3,10,7,6,9,1,3,5 };
multiset<int>zz(z,end(z)), yy(y,end(y));
cout << (zz == yy ? "Yes!" : "No!");
}
Похожие вопросы
- Написать программу на c++ с готовым кодом и блок схемой
- Помогите написать программу на C++
- Написать код для задачи на C++
- Написать программу на c++
- Помоги пожалуйста написать программу на C++
- Помогите с программой на C++
- Короткая программа на C++
- Написать программу на C++.Создать класс vector3d, задаваемый тройкой координат. Создать конструктор...
- Помогите написать программу на C++
- Составить программу на c++ УСПОЛЬЗУЯ МАССИВ!!!