|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Самая длинная подстрока |
|
C/C++ - Самая длинная подстрока
|
Новый участник Сообщения: 5 |
Профиль | Отправить PM | Цитировать Помогите решить задачу.
Дана строка, состоящая из маленьких латинских букв. Ваша задача — найти длину ее самой длинной подстроки, встречающейся в строке хотя бы 2 раза. Вхождения подстрок могут перекрываться. Максимальная длина строки - 100 символов. |
|
Отправлено: 18:26, 24-09-2013 |
Пользователь Сообщения: 139
|
Профиль | Отправить PM | Цитировать В гугле море алгоритмов для нахождения подстроки, выбирайте любой. Думаю проверить кол-во вхождений и найти самую длинную не составит труда.
|
------- Отправлено: 00:55, 25-09-2013 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 5
|
Профиль | Отправить PM | Цитировать Цитата ViRTaCe:
#include <stdio.h> #include <string.h> #include <conio.h> int HowMany(char string[], char word[]) { char *p = strstr(string, word); if(!p) return 0; return 1 + HowMany(p + strlen(word), word); } int HowMany(char *, char *); int main() { char string[200]; gets(string); int maxLen = 0; int mn = 0; while(maxLen != 0 && mn < 2) { char * pch = strtok (string," "); // получаем первое слово char * word = 0; // самое длинное слово int length = strlen(pch); // определяем длинну первого слова int maxLen = 0; // самое длинное слово while (pch != NULL) // пока есть слова { length = strlen(pch); // определяем длинну слова if (maxLen < length ) // определяем самое длинное слово { maxLen = length; word = pch; // сохраняем указатель на текущее слово } pch = strtok (NULL, " "); // получаем следующее слово } mn = HowMany(string, word); } printf("%d\n", mn); /*cout << "Самое длинное слово: " << word << " , его длина равна: " << maxLen << " символам " << endl;*/ getch(); return 0; } |
|
Отправлено: 11:29, 25-09-2013 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата MahovIV:
|
|
Отправлено: 12:39, 25-09-2013 | #4 |
Новый участник Сообщения: 5
|
Профиль | Отправить PM | Цитировать Цитата Iska:
#include <stdio.h> #include <string.h> #include <conio.h> int HowMany(char string[], char word[]) { char *p = strstr(string, word); if(!p) return 0; return 1 + HowMany(p + strlen(word), word); } int HowMany(char *, char *); int main() { int i, j = 0, k = 0, pr = 0, mn = 0; char s[100], c[100]; gets(s); while(j < strlen(s)) { while(k < strlen(s)) { for(i = 0; i < strlen(s); i++) { c[i] = s[i + k]; } mn = strlen(c); pr = HowMany(s, c); if(pr >= 2) { break; } delete(c); k++; } delete(c); k = 0; j++; } if(pr >= 2) { printf("%d\n", mn); } else { printf("0\n"); } getch(); return 0; } Что я делаю не так? |
||
Отправлено: 13:04, 25-09-2013 | #5 |
Новый участник Сообщения: 5
|
Профиль | Отправить PM | Цитировать Цитата ViRTaCe:
https://www.google.com.ua/search?ie=UTF-8&hl=ru&q=%D0%A1%D0%B0%D0%BC%D0%B0%D1%8F%20%D0%B4%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F%20%D0%BF%D0%BE %D0%B4%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0%20%D0%A1%D0%B8#hl=ru&q=%D0%A1%D0%B0%D0%BC%D0%B0%D1%8F+%D0 %B4%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F+%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0+%D0%A 1%D0%B8 Поисковая система - это не решение всех проблем. |
|
Отправлено: 17:57, 25-09-2013 | #6 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Не так.
1. Получить перечень всех уникальных подстрок, входящих в исходную. Минимальная — один символ, максимальная — вся исходная строка. 2. Принять максимальную длину искомой подстроки за «0». 3. Перебирая все полученные в п.1 уникальные подстроки, проверять количество вхождений каждой из них в исходную строку. 3а) если количество вхождений окажется больше единицы (т.е., подстрока встречается в искомой хотя бы дважды) и её длина больше, нежели текущее значение максимальной длины из п.2 — принять её максимальную длину за искомую. Решив эти частичные задачи — составные части алгоритма — Вы получите правильный результат. Не забудьте, что, согласно условия: Цитата MahovIV:
|
|
Отправлено: 20:17, 25-09-2013 | #7 |
Новый участник Сообщения: 5
|
Профиль | Отправить PM | Цитировать Цитата Iska:
#include <stdio.h> #include <string.h> #include <conio.h> int HowMany(char string[], char word[]) { char *p = strstr(string, word); if(!p) return 0; return 1 + HowMany(p + strlen(word), word); } int HowMany(char *, char *); int main() { int i, j = 0, k = 0, pr = 0, mn = 0, l = 0, f = 0; char s[100], c[100]; gets(s); while(j < strlen(s)) { for(i = 0; i < strlen(s) - j; i++) { c[i] = s[i + k]; } k++; mn = strlen(c); pr = HowMany(s, c); if(pr >= 2) { break; } l++; j++; } if(pr >= 2) { printf("%d\n", mn); } else { printf("0\n"); } getch(); return 0; } |
|
Отправлено: 20:42, 25-09-2013 | #8 |
Необычный Сообщения: 4463
|
Профиль | Сайт | Отправить PM | Цитировать MahovIV,
Цитата MahovIV:
От того, что вы копируете чужой код и просите его для вас переписать толку не будет. Код следует переписать полностью. И для строк используйте string, а не char *. Чтобы с полной уверенностью сказать "Это я сам!" |
|
------- Отправлено: 21:33, 25-09-2013 | #9 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
C/C++ - Длинная арифметика | Prof | Программирование и базы данных | 3 | 10-10-2011 15:31 | |
Интерфейс - [решено] Длинная строчка в контекстном меню | Stich777 | Microsoft Windows 7 | 6 | 15-01-2011 18:31 | |
Загрузка - Очень длинная загрузка | antikiller_bm | Microsoft Windows Vista | 8 | 30-06-2009 17:33 | |
>100m/LongLink - Длинная линия...?! | LordMadman | Сетевое оборудование | 15 | 26-04-2009 16:52 | |
Длинная строчка | bigkuler | Вебмастеру | 3 | 29-03-2009 17:50 |
|