Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2011, 21:15   #1
Igogo
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 17
По умолчанию задача по С++

Заданы z и y - две последовательности. Можно ли получить последовательность z вычеркиванием элементов из Y
Помогите с кодом,плиз...
Igogo вне форума Ответить с цитированием
Старый 05.11.2011, 21:25   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Идея:
Два курсора - по последовательности z, по последовательности y.
Если *z (элемент под курсором z) совпадает с *y, смещаем оба курсора на одну позицию. Если не совпадают, значит, при приведении этот элемент y надо будет вычеркнуть - смещаем курсор по y на одну позицию. Если мы так ушли за пределы массива z - значит, все его элементы, и именно в таком порядке, нашлись в массиве y. Если же мы раньше исчерпали y - увы, z не получится.

Тестовые примеры:
Y: 1,2,3,4,5,6,7
Z: 1,2,3,4,5,6,7

Y: 1,2,3,1,3,2,1
Z: 1,2,1,3,1,2

Y: 1,2,3,4,5,6,7
Z: 1,3,5,6,7
Abstraction вне форума Ответить с цитированием
Старый 05.11.2011, 21:33   #3
Igogo
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 17
По умолчанию Решение

Пусть 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 получить нель-

зя.
Проблема с написанием кода...
Igogo вне форума Ответить с цитированием
Старый 05.11.2011, 22:50   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
ищем минимальное k
Плохой шаг. То есть, можно и так (взяв отдельную функцию FindNearestElement), но само действие не "элементарно", оно подразумевает внутренний алгоритм. С другой стороны, я сейчас перепишу то, что написано у меня, в несколько ином виде:
Код:
//Функция проверки, можно ли в последовательности y выделить подпоследовательность z
//аргументы - y, "длина y", z, "длина z"
//Возвращается true, если в y можно выделить z и false иначе
    //Два курсора - по последовательности z, по последовательности y.
    //Ставим их на начала массивов
    //Пока "курсор z" не вышел за границы z
        //Если "курсор y" вышел за границы y (Если же мы раньше исчерпали y)
            //увы, z не получится
        //Если *z (элемент под курсором z) совпадает с *y,
            //смещаем оба курсора на одну позицию.
        //(иначе) Если не совпадают,
            //смещаем курсор по y на одну позицию.
    //Закончили с "пока" - значит, мы так ушли за пределы массива z
    //значит, все его элементы, и именно в таком порядке, нашлись в массиве y.
Является ли проблемой написать под комментарием аналогичный код для какого-то комментария? Если да, то приведите этот блок комментариев с кодом, написанным там, где это получилось, и указанием тех мест, где это не получилось.

Попробуйте в виде таких же комментариев написать свой алгоритм.
Abstraction вне форума Ответить с цитированием
Старый 05.11.2011, 23:26   #5
Igogo
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 17
По умолчанию

Напишите свой код, если можно.
Igogo вне форума Ответить с цитированием
Старый 06.11.2011, 00:14   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Код:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;


int main()
{
	string s;
	vector<int> first, second;

	getline(cin, s);
	copy(istream_iterator<int>(istringstream(s)), istream_iterator<int>(), back_inserter(first));
	getline(cin, s);
	copy(istream_iterator<int>(istringstream(s)), istream_iterator<int>(), back_inserter(second));

	vector<int>::iterator iter1, iter2;
	for(iter1 = first.begin(), iter2 = second.begin();
		iter1 != first.end() && iter2 != second.end(); iter2++)
		if(*iter1 == *iter2)
			iter1++;

	cout << boolalpha << (iter1 == first.end());

	return 0;
}
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 06.11.2011, 00:33   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Напишите свой код, если можно.
Ответьте на мой вопрос, если можно.
Цитата:
Является ли проблемой написать под комментарием аналогичный код для какого-то комментария? Если да, то приведите этот блок комментариев с кодом, написанным там, где это получилось, и указанием тех мест, где это не получилось.
Abstraction вне форума Ответить с цитированием
Старый 06.11.2011, 00:52   #8
Igogo
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 17
По умолчанию к Abstraction

Не обладаю достаточными навыками, только учусь.
Не много не понял в начале:
//Функция проверки, можно ли в последовательности y выделить подпоследовательность z
//аргументы - y, "длина y", z, "длина z"
//Возвращается true, если в y можно выделить z и false иначе

Напишите начало кода, а дальше попробую сам.

Заранее спасибо!
Igogo вне форума Ответить с цитированием
Старый 06.11.2011, 00:56   #9
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Имелось в виду, что это заголовок функции и общее описание результата её работы. Увы, реальные типы зависят от того, что за элементы в последовательности. Положим, целые числа, влезающие в int.
Также предполагаю, что компилятор у Вас понимает bool, true, false. Если нет, заменить их на int, 1, 0 соответственно.
Код:
//Функция проверки, можно ли в последовательности y выделить подпоследовательность z
//аргументы - y, "длина y", z, "длина z"
//Возвращается true, если в y можно выделить z и false иначе
bool FindIfIsSubsequence(int* y, int yLength, int* z, int zLength){
    //Два курсора - по последовательности z, по последовательности y.
    //Ставим их на начала массивов
    //Пока "курсор z" не вышел за границы z
        //Если "курсор y" вышел за границы y (Если же мы раньше исчерпали y)
            //увы, z не получится
            return false;
        //Если *z (элемент под курсором z) совпадает с *y,
            //смещаем оба курсора на одну позицию.
        //(иначе) Если не совпадают,
            //смещаем курсор по y на одну позицию.
    //Закончили с "пока" - значит, мы так ушли за пределы массива z
    //значит, все его элементы, и именно в таком порядке, нашлись в массиве y.
    return true;
}

Последний раз редактировалось Abstraction; 06.11.2011 в 00:58.
Abstraction вне форума Ответить с цитированием
Старый 06.11.2011, 01:23   #10
Igogo
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 17
По умолчанию

курсор z и курсор y подразумевается как два цикла?
Igogo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача по С++ krasotochka Помощь студентам 1 07.09.2011 22:28
Задача минимизации дисбаланса на линии сборки (задача минимакса) LenZab Microsoft Office Excel 13 13.03.2011 22:51
Задача Виталя5230 Помощь студентам 4 20.10.2010 16:57