Обобщение правильных скобочных последовательностей #435354


#0 by Ненавижу 1С
Вынесу в отдельную тему Для символов L[1],L[2],...,L[K],R[1],R[2],...,R[K] строка считается правильной, если: 1. она пустая 2. может быть построена по правилам: 2.1. если S - правильная строка, то L[i]+S+R[i] - правильная 2.1. если S1, S2 - правильные строки, то S1+S2 - правильная Требуется: 1. Для произвольной строки определить, что она правильная 2. Для числа N определить число правильных строк длины 2*N
#1 by Ёпрст
ну вот:    Сч=0;Сч2=0;    Пока Найти(Стр,"")+Найти(Стр,"[]")>0 Цикл        Пока Найти(Стр,"")>0 Цикл            Стр = СтрЗаменить(Стр,"","");            сч=сч+1;        КонецЦикла;                Пока Найти(Стр,"[]")>0 Цикл            Стр = СтрЗаменить(Стр,"[]","");            сч2=сч2+1;        КонецЦикла;    КонецЦикла;    Если СтрДлина(Стр)>0 Тогда        Сообщить("не правильная..");    Иначе        Сообщить("Правильная");    КонецЕсли;    Сообщить("Количество "+сч);    Сообщить("Количество [] "+сч2);
#2 by Ненавижу 1С
считаю Найти и СтрЗаменить циклом по строке
#3 by Ёпрст
не вопрос:    Стр = СокрЛП(с);    сч=0;    Для к =1 По СтрДлина(Стр)  Цикл        Символ = Сред(Стр,к,1);        Если Символ="(" Тогда            сч=сч+1;        ИначеЕсли Символ = "["Тогда            сч=сч+0.1;        ИначеЕсли Символ = ")" Тогда            Если (Цел(сч)=сч)и(сч>0) Тогда                сч=сч-1;            Иначе                Прервать;            КонецЕсли;        ИначеЕсли Символ = "]" Тогда            Если (Цел(сч)<>сч)и(сч>0) Тогда                сч=сч-0.1;            Иначе                Прервать;            КонецЕсли;        КонецЕсли;            КонецЦикла;        Если СтрДлина(сч)>0 Тогда        Сообщить("не правильная..");    Иначе        Сообщить("Правильная");    КонецЕсли;
#4 by Ёпрст
А чего код перестал подсвечиваться ? Теги ввели что ли ?
#5 by Ёпрст
[CODE]йцукцйукйцк[/CODE]
#6 by Ненавижу 1С
нужно для общего случая из
#7 by orefkov
1 элементарно. Считываем по символу из строки, если это L[i], заносим i в стек, если это R[i], проверяем, что на верхушке стека такое же i и выносим из стека, иначе выходим. Если дошли до конца строки, и стек пуст - строка правильная. А вот второе так сразу и не знаю, я больше прикладник, чем теоретик.
#8 by Ненавижу 1С
отлично, и проверка на то, что из стека можно вообще что либо достать (не пустой) при R[i] случай с K=1 тоже самое, только вместо стека используется только его счетчик заполненности
#9 by orefkov
Функция ПравильнаяПоследовательность(Поток, ЛевыеСимволы = "([{", ПравыеСимволы = ")]}")    д = СтрДлина(Поток);    Если д % 2 = 1 Тогда        Возврат 0;    КонецЕсли;    стек = СоздатьОбъект("СписокЗначений");    г = 0;    Для Номер = 1 По д Цикл        с = Сред(Поток, Номер, 1);        н = Найти(ЛевыеСимволы, с);        Если н > 0 Тогда            стек.ДобавитьЗначение(н);            г = г + 1;        Иначе            н = Найти(ПравыеСимволы, с);            Если н = 0 Тогда                Возврат 0;            КонецЕсли;            Если г = 0 Тогда                Возврат 0;            КонецЕсли;            Если н <> стек.ПолучитьЗначение(г) Тогда                Возврат 0;            КонецЕсли;            стек.УдалитьЗначение(г);            г = г - 1;        КонецЕсли;    КонецЦикла    Возврат ?(г = 0, 1, 0); КонецФункции
#10 by Ненавижу 1С
ага, у меня на 8.1 Функция Тест(МояСтрока,ОткрывающиесяСкобки="([",ЗакрывающиесяСкобки=")]")     Стек = Новый Массив;     Для й=1 по СтрДлина(МояСтрока) Цикл          Символ = Сред(МояСтрока,й,1);          С = Найти(ЗакрывающиесяСкобки,Символ);          Если С>0 Тогда               Если Стек.Количество=0 Тогда                    Возврат Ложь;                             ИначеЕсли Сред(ОткрывающиесяСкобки,С,1)<>Стек[0] Тогда                    Возврат Ложь;                                             Иначе                    Стек.Удалить;               КонецЕсли;          ИначеЕсли Найти(ОткрывающиесяСкобки,Символ)>0 Тогда               Стек.Вставить(0,Символ);          КонецЕсли;     КонецЦикла;     Возврат (Стек.Количество=0); КонецФункции
#11 by Ненавижу 1С
во истину, википедия знает все: ответ (K^N)*((2*N)!/(N!*(N+1)!))
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С