доброго вечера, может кто помочь написать программу ? ломаю голову уже не первый день, и даже зная что нужно делать все равно не получается это запрограммировать, если не сложно помогите пожалуйста
Задан массив символов A[n]. Найти самую длинную повторяющуюся последовательность символов и переписать ее в отдельный массив
Просто найти длиннейшую последовательность - это я могу, но вот повторяющуюся минимум 2 раза - с этим у меня проблемы . .
Вариант решения у меня есть, но все равно не получается, вот вариант :
Ищем первую последовательность. Проходим массив до конца, в поиске точно такой же последовательности (во внутреннем цикле). Если найдена, сохраняем ее в переменную максимальной последовательности, создаем переменную хранящую ее размер. Дальше во внешнем цикле ищем следующую последовательность символов. И снова во внутреннем ищем, повторяется она или нет. Если повторяется, то сравниваем ее размер, с размером максимальной сохраненной в переменную. Если она длиннее, то заменяем массив с максимальной последовательностью на новую, если нет - оставляем без изменений. Таким образом, дойдя во внешнем цикле до конца, мы получим в нашем массиве самую длинную последовательность.
То есть в примере введенного массива a b c K L M N k q w K L M N, здесь последовательность будет к л м н, для проверки я использовал массив на 26 элементов в котором был английский алфавит, потом проверял значение введенного символа на его порядковый номер в алфавите, и записывал. Далее вводилось 2 значение, и так же находился его порядковый номер, и если этот порядковый номер при проверке на -1 был равен предыдущему символу- значит символ идет последовательно, и делал так до конца пока проверка на последовательность не становилась неверной, указав координаты начала последовательности и конца - которые при 2 совпадающем символе я начал считать, записывал эту последовательность в массив, и записывал ее размер вида конец минус начало в отдельную переменную получая количество символов в массиве, потом находя след. последовательность проделывал то же самое, сравнивал размер с тем что записан в максимальную, и если больше то заменял. А вот при минимум 2 повторах я бессилен . .надеюсь на вашу помощь, заранее спасибо
И если возможно - используйте не сильно профессиональные варианты написания отдельных строк в программе, т.к с многими из них я еще не сталкивался, и очень проблематично разбираться что они значат.
Другие языки программирования и технологии
Помогите пожалуйста написать программу в с++
Не знаю, правильно ли понял задачу?
Пусть имеется последовательность: "0123491239", видно что в ней ровно два повторяющихся участка, это последовательности символов "123", т. о. задача и состоит в их нахождении.
Если это так, то довольно легко такую задачу решить, используя шаблонные алгоритмы:
#include <algorithm>
#include <iostream>
using namespace std;
int main() {
cout << "n? ";
int n;
cin >> n;
cout << "seq? ";
char *a = new char[n];
for (int i = 0; i < n; ++i) cin >> a[ i];
char *m = new char[n / 2];
int mn = 0;
for (int cn = 1; cn <= n / 2; ++cn) {
for (char *pc = a; pc < a + n - cn - cn; ++pc) {
if (search(pc + cn, a + n, pc, pc + cn) != a + n) {
copy(pc, pc + cn, m);
mn = cn;
break;
}
}
}
if (mn) {
cout << "seq: ";
for (int i = 0; i < mn; ++i) cout << m[ i];
}
delete [] a;
delete [] m;
return 0;
}
Пусть имеется последовательность: "0123491239", видно что в ней ровно два повторяющихся участка, это последовательности символов "123", т. о. задача и состоит в их нахождении.
Если это так, то довольно легко такую задачу решить, используя шаблонные алгоритмы:
#include <algorithm>
#include <iostream>
using namespace std;
int main() {
cout << "n? ";
int n;
cin >> n;
cout << "seq? ";
char *a = new char[n];
for (int i = 0; i < n; ++i) cin >> a[ i];
char *m = new char[n / 2];
int mn = 0;
for (int cn = 1; cn <= n / 2; ++cn) {
for (char *pc = a; pc < a + n - cn - cn; ++pc) {
if (search(pc + cn, a + n, pc, pc + cn) != a + n) {
copy(pc, pc + cn, m);
mn = cn;
break;
}
}
}
if (mn) {
cout << "seq: ";
for (int i = 0; i < mn; ++i) cout << m[ i];
}
delete [] a;
delete [] m;
return 0;
}
это похоже на одну из задач поиска синхроимпульса
можно это сделать разными способами, но проще для данного варианта использовать разностный метод при смещении копии последовательности, относительно несмещённой. Наибольшее количество нулей в результирующей разности будет признаком где искать и какой период повторения у повторяющейся последовательности
можно это сделать разными способами, но проще для данного варианта использовать разностный метод при смещении копии последовательности, относительно несмещённой. Наибольшее количество нулей в результирующей разности будет признаком где искать и какой период повторения у повторяющейся последовательности
> Задан массив символов A[n]. Найти самую длинную повторяющуюся последовательность символов и переписать ее в отдельный массив
Дальше многа букаф, не асилил
Мой вариант на C++:
#include <iostream>
#include <iterator>
#include <locale>
#include <algorithm>
#include <functional>
template <typename>
void find_longest(I begin, I end, U u)
{
typedef typename std::iterator_traits::difference_type difference_type;
I next, first = begin, found = end;
difference_type max_seq = 0;
for ( ; (next = std::adjacent_find(begin, end, u)) != end; begin = ++next)
{
const difference_type curr_length = std::distance(begin, next) + 1;
if (curr_length > max_seq)
{ max_seq = curr_length; found = begin; }
}
const difference_type last_length = std::distance(begin, next);
if (last_length > max_seq)
{ max_seq = last_length; found = begin; }
typedef typename std::iterator_traits::value_type T;
typedef std::ostream_iterator<t> O;
std::cout << "Исходная последовательность: " << std::endl;
std::copy(first, end, O(std::cout, " "));
std::cout << std::endl;
std::cout << "Самая длинная последовательность: " << std::endl;
std::copy(found, found + max_seq, O(std::cout, " "));
std::cout << std::endl;
}
struct R
{
int operator()() const
{
return rand() % 21 - 10;
}
};
int main()
{
setlocale(LC_ALL, "");
srand((unsigned) time(NULL));
int arr[20];
std::generate_n(arr, sizeof(arr) / sizeof(arr[0]), R());
find_longest(arr, arr + sizeof(arr) / sizeof(arr[0]), std::not2(std::equal_to<int>()));
return 0;
}
Демонстрация: hxxp://codepad. org/rhgt3DPV
Дальше многа букаф, не асилил
Мой вариант на C++:
#include <iostream>
#include <iterator>
#include <locale>
#include <algorithm>
#include <functional>
template <typename>
void find_longest(I begin, I end, U u)
{
typedef typename std::iterator_traits::difference_type difference_type;
I next, first = begin, found = end;
difference_type max_seq = 0;
for ( ; (next = std::adjacent_find(begin, end, u)) != end; begin = ++next)
{
const difference_type curr_length = std::distance(begin, next) + 1;
if (curr_length > max_seq)
{ max_seq = curr_length; found = begin; }
}
const difference_type last_length = std::distance(begin, next);
if (last_length > max_seq)
{ max_seq = last_length; found = begin; }
typedef typename std::iterator_traits::value_type T;
typedef std::ostream_iterator<t> O;
std::cout << "Исходная последовательность: " << std::endl;
std::copy(first, end, O(std::cout, " "));
std::cout << std::endl;
std::cout << "Самая длинная последовательность: " << std::endl;
std::copy(found, found + max_seq, O(std::cout, " "));
std::cout << std::endl;
}
struct R
{
int operator()() const
{
return rand() % 21 - 10;
}
};
int main()
{
setlocale(LC_ALL, "");
srand((unsigned) time(NULL));
int arr[20];
std::generate_n(arr, sizeof(arr) / sizeof(arr[0]), R());
find_longest(arr, arr + sizeof(arr) / sizeof(arr[0]), std::not2(std::equal_to<int>()));
return 0;
}
Демонстрация: hxxp://codepad. org/rhgt3DPV
Похожие вопросы
- Помогите, пожалуйста, написать программу на делфи с ассемблерными вставками.
- Помогите, пожалуйста, написать программу на С++
- Привет всем! Помогите, пожалуйста, написать программу в C++.
- Помогите пожалуйста написать программу на языке Borland С++ Builder
- Помогите пожалуйста написать программу на языке программирования AssemblerКто первый поможет сделать правильно10балов+50
- Помогите пожалуйста написать программу в Паскале )) Написать программу для вычисления суммы в массиве из 10 элементов
- Помогите пожалуйста написать программу на c++.
- Помогите, пожалуйста, написать программу на Паскале хотя бы примерно
- Помогите, пожалуйста, написать программу на C++.
- Помогите пожалуйста написать программу очень нужно!!!