Страница 1 из 2

Подстроки в строке

Добавлено: 15 июл 2008, 19:57
Лена89
Привет!

Есть строка: аааа бббб вввв гггг дддд.

Подстроки №1 : аааа бббб;
аааа бббб вввв.

Подстроки №2 : аааа бббб;
аааа бббб вввв;
аааа бббб вввв гггг.

Подстроки №3 : гггг дддд;
аааа ююю ыыыы.

Как программным путем можно определить, какие подстроки, из всех имеющихся, наиболее часто и правильно совпадают со строкой (в данном случае – подстроки №2)? Что бы можно было вывести или записать их куда-нибудь … не суть важно.

Пробовала работать используя - char *strstr( const char *string, const char *strCharSet ); . Но ничего не вышло.

Извините, если вопрос задан непонятно.

Спасибо! Всего наилучшего!

P.S. работаю в Visual C++ 6.0

Re: Подстроки в строке

Добавлено: 15 июл 2008, 20:56
Romeo
Всё верно пыталась, именно эту функцию и следует использовать. Если функция возвращает не NULL, значит подстрока содержится в строке.

Re: Подстроки в строке

Добавлено: 15 июл 2008, 23:10
Vasilisk
А что означает фраза "наиболее часто и правильно совпадают"?

Re: Подстроки в строке

Добавлено: 16 июл 2008, 20:03
Лена89
Т.е. №1 совпадет 2 раза, т.к. они "правильные" (из тех же символов, тоже кол-во символов в слове ...), но их всего 2 (подстроки). №2 совпадет 3 раза, т.к. они "правильные" и их 3, т.е. больше чем 2 в №1. №3 совпадет 1 раз, т.к. одна подстрока "неправильная". Вот и выходит, что №2.
В примере я указала три набора подстрок, но может быть больше. Вопрос как наиболее "по уму", программным путем выявить (исходя из этого примера) подстроки №2.

Возможно опять кривовато написала...извини.

Re: Подстроки в строке

Добавлено: 17 июл 2008, 02:43
Vasilisk
Ну, говорят, что умение ясно излагать есть отражение умения ясно мыслить :) Для программиста неумение излагать - системообразующий недостаток.

Насколько я могу понять, в твоих речениях говорится о "жадности" алгоритма - о нахождении вхождения подстроки максимальной длины. В теме "регулярные выражения" этот вопрос всесторонне обсасывается, но у нас C и нет RegEx'a

В таком случае я рекомендую следующий алгоритм. Берётся массив подстрок и упорядочивается так, чтобы самая длинная была первой. Заводится массив счётчиков - той же длины, что число подстрок. Далее организуется цикл, начиная с первого байта строки - перебираются подстроки, начиная сверху и в случае совпадения - приписывается единица в счётчик. Указатель строки сдвигается на один символ и цикл перебора подстрок повторяется...

По окончании алгоритма нужно только проанализировтаь счётчики.

Re: Подстроки в строке

Добавлено: 17 июл 2008, 14:29
Лена89
Спасибо Vasilisk, что возишься со мной, не смотря на мои системообразующие недостатки! :) Понимаю...несколько нагловато с моей стороны просить исходничек, но может сбросищь какой-нибудь на "скорую руку". Я бы доработала.

Re: Подстроки в строке

Добавлено: 18 июл 2008, 04:24
Vasilisk
Лена89 писал(а):Спасибо Vasilisk, что возишься со мной, не смотря на мои системообразующие недостатки! :) Понимаю...несколько нагловато с моей стороны просить исходничек, но может сбросищь какой-нибудь на "скорую руку". Я бы доработала.

Код: Выделить всё


char * stroka; //предполагаем, что это то, что разбираем, она где-то вводится

struct substroka{
  int       n_cnt;    //счётчик вхождений подстрок (при вооде подстроки - обнуляется)
  char * p_ss;      //сама подстрока, она где-то вводится
};

substroka ss[<сколько-то там подстрок>];


//бо-о-ольшой :) главный цикл, в котором мы едем по одному символу вправо и гоним 
//сравнение со всем массивом подстрок, что у нас есть
for(int i=0; i<::strlen(stroka); i++){
  
  for(j=0; j<сколько-то там подстрок; j++){

    if(::strcmp(stroka+1,ss[j].p_ss) == 0) ss[j].n_cnt++;

                                                               }  
}

//здесь надо проанализировать содержимое всех ss[...].n_cnt и принять решение, которая подстрока оказалась the closest к исходной строке...


Re: Подстроки в строке

Добавлено: 18 июл 2008, 11:06
Лена89
Спасибо! Чмок-чмок!

Re: Подстроки в строке

Добавлено: 18 июл 2008, 11:36
Romeo
&quot писал(а):Спасибо! Чмок-чмок!
Жуть. Боюсь предположить что было бы, если бы Vasilisk написал тебе программу целиком :)

Re: Подстроки в строке

Добавлено: 19 июл 2008, 16:46
Vasilisk
Неа, ничего бы не было. Это был квалифицированно исполненный барышней "развод на понт", с целью выяснить, умеет ли парниша "программировать вааще" :) :) :) Снимаю шляпу - я вполне доволен состоявшей "серией транзакций".