Проверка введённой строки соответствию маске-ввода - C#

Узнай цену своей работы

Формулировка задачи:

Есть строка, состоящая из 4-х различных букв ("a","b","c","d") Есть маска, которой должны соответствовать введённые строки: a+b*|c?d где
  • a+ - может быть 1 или 2 символа
  • b* - может быть любое количество символов , начиная с 1
  • с? - может быть 1 или 0 символов
  • d - 1 символ
  • b*|c? - логическое "или": Или в строке может быть любое количество букв "b", либо 1 или 0 символов "с".
Например, строки, соответствующие условию:
  • aabbbd
  • acd
  • ad
  • aad
  • abbbbbbbbbbbbd
и.т.д Задача состоит в том, чтобы написать проверку всех строк, на соответствию заданной маске БЕЗ ИСПОЛЬЗОВАНИЯ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ. Есть идея, хранить максимальное допустимое значение для каждой букве в счетчике. Дальше, просто посимвольно считывать количество символов каждого типа в веденной строке и сравнивать с максимальным допустимым значением счетчика. Может быть кто-то делал уже подобное, или накинет идею для реализации, т.к. мой вариант хоть и возможен, но далеко не идеальный

Решение задачи: «Проверка введённой строки соответствию маске-ввода»

textual
Листинг программы
using System;
 
namespace ConsoleApplication221
{
    class Program
    {
        static void Main(string[] args)
        {
            //описываем переходы
            var steps = new Step[]
            {
                new Step('a', 0, 1),
                new Step('a', 1, 2),
                new Step('b', 1, 3),
                new Step('b', 2, 3),
                new Step('b', 3, 3),
                new Step('c', 1, 4),
                new Step('c', 2, 4),
                new Step('d', 1, 5),
                new Step('d', 2, 5),
                new Step('d', 3, 5),
                new Step('d', 4, 5),
                new Step('$', 5, -1)
            };
 
            //задаем входную строку
            var str = Console.ReadLine();
 
            //проверяем строку
            if (StateMachine.Check(str, steps))
                Console.WriteLine("Строка подходит");
            else
                Console.WriteLine("Строка НЕ подходит");
 
            Console.ReadLine();
        }
    }
 
    public static class StateMachine
    {
        public static bool Check(string str, Step[] steps)
        {
            //начальное состояние
            int state = 0;
 
            //добавляем символ конца
            str = str + "$";
 
            //проверяем переходы
            foreach (var c in str)
            {
                var found = false;
 
                foreach (var step in steps)
                    if (step.Accept(c, ref state))
                    {
                        //сработал переход
                        found = true;
                        break;
                    }
 
                if (!found) return false;//ни один переход не сработал
                if (state == -1) return true;//достигнуто конечное состояние
            }
            //символы закончились, а конечное состояние - не достигнуто
            return false;
        }
    }
 
    // Переход конечного автомата
    public struct Step
    {
        char @char;
        int fromState;
        int toState;
 
        public Step(char c, int from, int to)
        {
            @char = c;
            fromState = from;
            toState = to;
        }
 
        //срабатывает ли переход для данного символа и данного состояния?
        public bool Accept(char c, ref int state)
        {
            if (c == @char && state == fromState)
            {
                state = toState;
                return true;
            }
 
            return false;
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы