Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Самая длинная подстрока

Ответить
Настройки темы
C/C++ - Самая длинная подстрока

Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Помогите решить задачу.
Дана строка, состоящая из маленьких латинских букв. Ваша задача — найти длину ее самой длинной подстроки, встречающейся в строке хотя бы 2 раза. Вхождения подстрок могут перекрываться.
Максимальная длина строки - 100 символов.

Отправлено: 18:26, 24-09-2013

 

Аватара для ViRTaCe

Пользователь


Сообщения: 139
Благодарности: 11

Профиль | Отправить PM | Цитировать


В гугле море алгоритмов для нахождения подстроки, выбирайте любой. Думаю проверить кол-во вхождений и найти самую длинную не составит труда.

-------
Кривые руки исправляются опытом.


Отправлено: 00:55, 25-09-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить 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
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата MahovIV:
Программа выглядит вот-так. »
Здесь ищутся слова, а не подстроки.

Отправлено: 12:39, 25-09-2013 | #4


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
Цитата MahovIV:
Программа выглядит вот-так. »
Здесь ищутся слова, а не подстроки. »
Я пробовал сделать вот-так.
Код: Выделить весь код
#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
Благодарности: 0

Профиль | Отправить 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
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Не так.

1. Получить перечень всех уникальных подстрок, входящих в исходную. Минимальная — один символ, максимальная — вся исходная строка.

2. Принять максимальную длину искомой подстроки за «0».

3. Перебирая все полученные в п.1 уникальные подстроки, проверять количество вхождений каждой из них в исходную строку.
3а) если количество вхождений окажется больше единицы (т.е., подстрока встречается в искомой хотя бы дважды) и её длина больше, нежели текущее значение максимальной длины из п.2 — принять её максимальную длину за искомую.

Решив эти частичные задачи — составные части алгоритма — Вы получите правильный результат. Не забудьте, что, согласно условия:
Цитата MahovIV:
Вхождения подстрок могут перекрываться. »
строка «abbbbc», например, будет содержать три вхождения подстроки «bb».

Отправлено: 20:17, 25-09-2013 | #7


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
Не так.
1. Получить перечень всех уникальных подстрок, входящих в исходную. Минимальная — один символ, максимальная — вся исходная строка.
2. Принять максимальную длину искомой подстроки за «0».
3. Перебирая все полученные в п.1 уникальные подстроки, проверять количество вхождений каждой из них в исходную строку.
3а) если количество вхождений окажется больше единицы (т.е., подстрока встречается в искомой хотя бы дважды) и её длина больше, нежели текущее значение максимальной длины из п.2 — принять её максимальную длину за искомую.
Решив эти частичные задачи — составные части алгоритма — Вы получите правильный результат. Не забудьте, что, согласно условия:
Цитата MahovIV:
Вхождения подстрок могут перекрываться. »
строка «abbbbc», например, будет содержать три вхождения подстроки «bb». »
Подскажите, что мне нужно исправить в коде?
Код: Выделить весь код
#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


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


MahovIV,
Цитата MahovIV:
Подскажите, что мне нужно исправить в коде? »
вам надо спокойно сесть, выключить компьютер (уйти в другую комнату), нарисовать алгоритм на бумаге (схемой, картинкой, не важно), понять его, понять "что и как хочется сделать", и потом спокойно написать программу "своей" головой.
От того, что вы копируете чужой код и просите его для вас переписать толку не будет.
Код следует переписать полностью.
И для строк используйте string, а не char *.
Чтобы с полной уверенностью сказать "Это я сам!"

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:33, 25-09-2013 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Самая длинная подстрока

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход