| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > Вариации подстроки в строке. |
| Автор: .talisman 22.5.2005, 11:04 |
| Задача: Подсчитать колличество слов длины К из данных N букв, не содержащих данное подслово. есть символьные массивы: А и Б. Оба вводятся с клавиатуры в ходе выполнения программы. Строка Б является подстрокой А. Еще есть переменная len, которая определяет длину искомого слова. Например: пользователь вводит строку: "abcd". подстроку: "bc". длину слова: "3". формируем слова: abc -- bc имеет место приутствовать, каунт не увеличиваем. abd -- bc нет, увеличиваем каунт на единицу. bcd -- bc есть, каунт не увеличиваем. Общий алгоритм: 1. Получаем данные. 2. Формируем новые строки. 3. Проверяем содержание подстроки в новых строках и если она есть, то увеличиваем каунт. 4. записываем в файл. Вопрос: как перебрать всевозможные коомбинации при формировании новой строки? (порядок букв менять нельзя, то есть в предыдущем примере подстроки типа dcb нет). заранее спасибо. |
| Автор: maxim1000 22.5.2005, 13:28 | ||
| насколько я понял, каждое получаемое слово задается тем, какие буквы мы выкидываем, а какие оставляем (т.к. порядок менять нельзя) можно воспользоваться рекурсией (дальше, если есть желание, можно заняться оптимизацией):
если сделать класс string с нужными методами, то эта программка может даже скомпилироваться |
| Автор: Akina 23.5.2005, 07:55 |
| Опять элементарная задачка... ДУМАЙ!!! а не программы пиши... формула получается ВПРЯМУЮ... |
| Автор: segmentation_fault 23.5.2005, 18:25 |
| Ну формула-то впрямую получается, но это уже больше математика чем информатика. Может их препод хочет именно чтобы они алгоритм написали, а не нашли формулу и вставляли туда нужные значения. |
| Автор: .talisman 24.5.2005, 06:16 |
| формула надо, так как комбинаторику проходим. учится осталось три дня, а лаба еще не сдана. дай плиз формулу =) обещаю все потом выучить =) |
| Автор: .talisman 24.5.2005, 11:49 |
| насчет всех подслов фуормулу нашел: (m!)/(n!-(m!-n!), где m длина строки, а n длина генерируемых слов. в предыдущем примере m=4, а n=3. Получаем: (4!)/(3!-(4!-3!) = 4!/3! = 4. а вот как вычесть строки содержащие введенную подстроку я не знаю =( |
| Автор: Akina 24.5.2005, 11:53 |
| А какая разница - слова в строке или подстрока в слове? |
| Автор: .talisman 24.5.2005, 11:59 |
| что-то я не понял вашего вопроса. разницы никакой, но какое отношение этот пример имеет к данному случаю? хотя нет, разница в том, что слова в строке разделены пробелами. |
| Автор: Akina 24.5.2005, 12:08 | ||||
Только неправильную. С арифметикой сложности... приведи подобные, получится 1, независимо от m и n... уж как ты там подстановку сделал и посчитал не то что на самом деле получается...
Слово - совокупность символов. Пробел - такой же символ, как буква, цифра или там запятая, пока не определен его специальный статус. В твоем задании он НЕ определен. Мысли абстрактнее... |
| Автор: .talisman 24.5.2005, 12:33 |
| так ничего и не понял если делать абстрактно и просто найти кол-во всевозможным подслов заданной длины, то я не понимаю как проверить, какие подслова содержут подстроку, а какие нет. |
| Автор: .talisman 24.5.2005, 14:05 | ||
| по совету maxim1000 попробовал воспользоваться рекурсией. писалось в борлан си++ 3.1, 1992 года, досовская =) проблема -- результат всегда равен нулю.
|
| Автор: maxim1000 25.5.2005, 03:15 | ||||||
по-моему, здесь получилось не совсем то, что я предполагал:
в алгоритме в функцию передается строка с добавлением одного символа а в реализации передается строка из одного символа тут надо было бы выделить память (new или массивом) под новую строку, записать туда старую и добавить еще один символ можно вообще использовать один буфер для всех вызовов: просто сделать его достаточно большим (k+1 должно хватить), и перед вторым рекурсивным вызовом добавлять туда символ, а после - удалять (т.к. этот буфер используется и предыдущими вызовами)
P.S. кстати, когда с помощью scanf читается число, надо давать адрес переменной для созранения результата - перед len надо ставить &... |
| Автор: .talisman 25.5.2005, 14:49 |
| огромное спасибо. насчет амперсанда знал, опечатался =) |