Я думаю, вы должны сделать это с помощью довольно простой рекурсивной строковой функции f
:
- Посмотрите на первый символ строки
- Если этострочная буква, вернуть остаток строки
- Если это
Z
, вернуть f(the rest of the string)
- Если это
M, K, P, or Q
, вернуть f(f(the rest of the string))
- В противном случае вернуть всю строку
Затем обернуть это в функцию g
, которая возвращает true, если f возвращает пустую строку, и false в противном случае.Сделайте это для каждого сообщения.
Это работает, потому что описанная вами грамматика является простой древовидной структурой: любой узел с двумя дочерними элементами равен M, K, P, or Q
, любой узел с одним дочерним элементом - Z
, а любой лист - строчная буква.f
всегда использует ровно один узел в дереве, возвращает остаток дерева (включая братьев и сестер) и возвращает непустую строку в искаженном дереве.