Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/35: Рейтинг темы: голосов - 35, средняя оценка - 4.66
1 / 1 / 2
Регистрация: 13.06.2010
Сообщений: 51

Алгоритм "Шаблон и слово"

15.09.2010, 01:59. Показов 7039. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача:
Рассмотрим слова из больших латинских букв и шаблоны, состоящие из больших латинских букв и символов «?» и «*».
Будем считать, что слово подходит под шаблон, если в шаблоне можно заменить каждый символ «?» на большую латинскую букву, а каждый символ «*» – на последовательность (возможно, пустую) больших латинских букв, так, чтобы получилось требуемое слово. Написать программу, определяющую, подходит ли слово под шаблон.
Входные данные - две строки: в одной строке записан шаблон – последовательность больших латинских букв, «?» и «*», в другой – слово, состоящее только из больших латинских букв. Обе строки не превышают 255 символов.
Выходные данные - необходимо вывести слово «YES», если слово подходит под шаблон и «NO» в противном случае.

Пример

Ввод:
ABBCDA
A*CDA

Вывод:
YES
Нашел, какие-то комментарии относительно этой задачи:
Для начала определим, какая из введенных строк является словом, а какая - шаблоном. Та строка, в которой есть символы '?' или '*' - шаблон. Если ни в одной из строк их нет, то в качестве шаблона возьмем произвольную. Будем определять, может ли часть слова (обозначим s1)с 1-го по k-й символ соответствовать части шаблона (обозначим s2)с 1-го по m-й символ (обозначим ak,m). Теперь есть 3 варианта:

* В шаблоне на m-м месте стоит буква. Тогда она соответствует последней букве слова и ak,m=(s1[k]=s2[m]) and ak-1,m-1
* В шаблоне на последнем месте стоит '?'. Тогда он соответствует последней букве слова и ak,m=ak-1,m-1
* В шаблоне на последнем месте стоит '*'. Тогда возможны два варианта: либо этой звездочке соответсвует пустая последовательность букв слова, либо непустая. Во втором случае в части слова с 1-го по k-1-й символ этой звездочке тоже соответствует некоторая последовательность букв (возможно пустая). Таким образом ak,m=ak-1,m or ak,m-1.

Осталось рассмотреть несколько моментов. Так как '*' может соответствовать пустая последовательность букв, то непустому шаблону вполне может соответствовать пустое слово, значит матрица a должна индексироваться не от 1, а от 0. Если же один из индексов отрицательный - то это всегда FALSE.

Заметим, что абсолютно аналогично можно решать задачу про соответсвие двух шаблонов. Просто добавятся еще несколько случаев.
Кому интересно, есть архив с входными/выходными данными для тестирования: http://olympiads.ru/problems/9v-04/237.rar
_ _ _ _ _ _
Помогите составить алгоритм решения этой задачи. Закодить я уже смогу, а вот алгоритм...
Не могу выработать какую-то четкую последовательность действий
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.09.2010, 01:59
Ответы с готовыми решениями:

Cоставить алгоритм Заменить слово P на пустое слово (удалить из Р все символы)
Помогите пожалуйста составить алгоритмы, прям очень надо!!! 1)A{a,b,c}. Заменить слово P на пустое слово т.е. удалить из Р все символы.

Cоставить алгоритм Если слово Р начинается с символа а, то заменить Р на пустое слово, а иначе Р не менять
Помогите пожалуйста составить алгоритмы, прям очень надо!!! 4)A{a,b,c}.Если слово Р начинается с символа а, то заменить Р на пустое...

Слово и шаблон
В первой строке записан шаблон, состоящий из строчных латинских букв и звёздочек, которые заменяют любую последовательность букв. Во второй...

6
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
15.09.2010, 08:51
Ограничения какие? Или вам любой работающий алгоритм?
0
1 / 1 / 2
Регистрация: 13.06.2010
Сообщений: 51
15.09.2010, 11:42  [ТС]
Любой работающий. Никаких ограничений, главное, чтобы я его понял и смог выполнить )
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
15.09.2010, 12:54
Во-первых, условие некорректно - непонятно, в какой строке слово, в какой шаблон. Причем в тестах звездочки есть то в первой строке, то во второй.
Какие, интересно, должны быть ответы на такие тесты?
Code
1
2
AA
A
Code
1
2
A
AA
Составитель задачи - идиот.
Будем считать, что шаблон во второй строке.

Solution 1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <fstream>
#include <vector>
#include <string>
 
using namespace std;
 
ifstream cin("input.txt");
ofstream cout("output.txt");
 
string s, p;  // слово и шаблон
 
/*match возвращает true, если подстрока s, начинающаяся с позиции spos
соответствует шаблону, являющемуся подстрокой p, начинающейся с позиции ppos*/
 
bool match(int spos, int ppos)
{
    if(spos == s.size() || ppos == p.size())         // если хотя бы одна строка закончилась, выходим
        return spos == s.size() && ppos == p.size(); // возвращаем true, если обе строки закончились
 
    else if(p[ppos] == '?')
        return match(spos+1,ppos+1);
 
    else if(p[ppos] == '*')
    {
        for(int i = spos; i <= s.size(); i++)
            if(match(i,ppos+1))
                return true;
    }
 
    else
        return s[spos] == p[ppos] && match(spos+1,ppos+1);
 
    return false;
}
 
void main()
{
    cin >> s >> p;
    if(match(0,0))
        cout << "YES";
    else
        cout << "NO";
}


Это решение проходит все тесты из вложения.
Но на моем тесте:
255 раз 'A'
254 раза '*' и в конце 'B'
оно будет работать много-много лет.

По каким-то причинам подобного теста во вложении нет. Составитель тестов к задаче - идиот.

На таком тесте данное решение очень много раз будет вызывать match с одними и теме же параметрами. Для оптимизации достаточно запомнить, какие пары (spos,ppos) уже обрабатывались и не рассматривать одно и то же дважды.

Solution 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <fstream>
#include <vector>
#include <string>
 
using namespace std;
 
ifstream cin("input.txt");
ofstream cout("output.txt");
 
string s, p;  // слово и шаблон
bool visited[1000][1000];
 
/*match возвращает true, если подстрока s, начинающаяся с позиции spos
соответствует шаблону, являющемуся подстрокой p, начинающейся с позиции ppos*/
 
bool match(int spos, int ppos)
{
    if(visited[spos][ppos])
        return false;
    visited[spos][ppos] = true;
    if(spos == s.size() || ppos == p.size())         // если хотя бы одна строка закончилась, выходим
        return spos == s.size() && ppos == p.size(); // возвращаем true, если обе строки закончились
 
    else if(p[ppos] == '?')
        return match(spos+1,ppos+1);
 
    else if(p[ppos] == '*')
    {
        for(int i = spos; i <= s.size(); i++)
            if(match(i,ppos+1))
                return true;
    }
 
    else
        return s[spos] == p[ppos] && match(spos+1,ppos+1);
 
    return false;
}
 
void main()
{
    cin >> s >> p;
    if(match(0,0))
        cout << "YES";
    else
        cout << "NO";
}
1
1 / 1 / 2
Регистрация: 13.06.2010
Сообщений: 51
15.09.2010, 14:57  [ТС]
Я именно дойти до этого не мог:

* - цикл
C++
1
2
3
for(int i = spos; i <= s.size(); i++)
                        if(match(i,ppos+1))
                                return true;


Огромное тебе спасибо!
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
15.09.2010, 15:22
А кстати про некорректность условия я чето нагнал.
0
1 / 1 / 2
Регистрация: 13.06.2010
Сообщений: 51
16.09.2010, 23:07  [ТС]
Информация расходится быстро
Наша задача и код уже оказалась у моей одногрупницы... )
Гугл, страшная вещь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.09.2010, 23:07
Помогаю со студенческими работами здесь

Составить нормальный алгоритм Маркова, который слово, отличающееся от слова "bbcca", перестроит в пустое слово
Задан алфавит A={a,b,c}. Составить нормальный алгоритм, который слово, отличающееся от слова &quot;bbcca&quot; перестроит в пустое слово. ...

Составить нормальный алгоритм Маркова, который слово, отличающееся от слова "bbcca", перестроит в пустое слово
Задан алфавит A={a,b,c}. Постройте нормальный алгорифм, что слово, которое отличается от слова bbcca перестоит в пустое слово.

Определить подходит ли слово под шаблон
Будем рассматривать слова из больших латинских букв и шаблоны, состоящие из больших латинских букв и символов «?» и «*». Говорят, что слово...

Как в Word заменить слово (вставить в шаблон) в колонтитуле?
В файле Word осуществляется получение всего текста (почему-то кроме колонтитула), далее ищем заданное слово и заменяем его. Как осуществить...

Написать программу, определяющую, подходит ли слово под шаблон
Задача «Шаблоны» Будем рассматривать слова из больших латинских букв и шаблоны, состоящие также из больших латинских букв и символов «?»...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru