Найти счастье

1. scientes 295 29.11.22 09:26 Сейчас в теме
Перебирая задачи, которые дают на собеседовании, наткнулся на следующую. В заданном тексте найти наименьшую подстроку, которая содержит все буквы из слова счастье. Порядок букв и регистр неважен. Если таких подстрок несколько, то найти ближайшую к началу текста. Кроме перебора с контролем ничего другого не придумал. Какие есть идеи ?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
8. user1863362 29.11.22 12:05 Сейчас в теме
(1) Это ты решил последовать совету в http://forum.infostart.ru/forum9/topic290631/message2907751/#message2907751 и счастье себе ищешь? Или к собеседованию кандидатов готовишся?
2. soft_wind 29.11.22 10:31 Сейчас в теме
простой встречный вопрос:,
а к бухгалтерскому или управленческому учету, данная задача как вообще относится?
3. beldieff 29.11.22 10:36 Сейчас в теме
(2) Счастье ищут и бухгалтера и управленцы.
4. booksfill 29.11.22 10:39 Сейчас в теме
Ну, если исходить из того, что это собеседование и долго думать некогда, то вот такой вариант:
Помещаем слова в тз (в пару приоритет, слово), потом в запросе используем регулярные выражения:
ВЫБРАТЬ
ТЗ.Приритет, ТЗ.слово
Поместить ВТ
ИЗ &ТЗ как ТЗ

ВЫБРАТЬ ПЕРВЫЕ 1 ВТ.* ИЗ ВТ ГДЕ слово Подобно "%с%Ч%а%с%т%ь%е%"
Упорядочить ПО Приоритет;

Более быстрый вариант в практической работе - использовать нормальные регулярные выражения, можно даже более-менее стандартно - добавляем html поле с JavaScript и используем его возможности.
5. booksfill 29.11.22 11:11 Сейчас в теме
(4)Шаблон только, кажется, лучше такой:
"%[с,ч,а,с,т,ь,е]%[с,ч,а,с,т,ь,е]%[с,ч,а,с,т,ь,е]%[с,ч,а,с,т,ь,е]%[с,ч,а,с,т,ь,е]%[с,ч,а,с,т,ь,е]%[с,ч,а,с,т,ь,е]%"
6. Sashares 35 29.11.22 11:23 Сейчас в теме
(5)под этот шаблон подходит "ааааааа"
Ну и посмотрите по ссылке из поста ТС примеры - там не слово надо найти, а часть фразы.
Прикрепленные файлы:
7. scientes 295 29.11.22 11:38 Сейчас в теме
Приведу свой код.
Функция НайтиСчастье(ИсходныеДанные,слово="счастье")
	
	вхСтрока=нрег(ИсходныеДанные);
	проверка=новый массив ;
	//создадим таблицу в первой колонке, которой будет храниться искомое слово
	буфер =новый ТаблицаЗначений;
	буфер.Колонки.Добавить();
	для i=1  по СтрДлина (слово) цикл  
		буква=Сред(слово,i,1);
        проверка.Добавить(буква); 
		буфер.Добавить();
	конеццикла;
	буфер.ЗагрузитьКолонку(проверка,0);

	
	
	
	//пройдемся по входной строке и оставим в ней только буквы из исходного слова
	//остальные буквы заменим пробелами
	//одновременно выполним проверку на то, что в строке присутствуют все буквы исходного слова
	arr=новый массив;
	для i=1  по СтрДлина (вхСтрока) цикл  
		буква=Сред(вхСтрока,i,1);
		если СтрНайти(слово,буква)>0 тогда
	     j=проверка.Найти(буква);
		 если j<>неопределено тогда
			 проверка.Удалить(j)
		 конецесли;	 
		 arr.Добавить(буква);
	    иначе
		 arr.Добавить(""); 
		конецесли; 
	конеццикла;
	
	если проверка.Количество()>0 тогда
		возврат "Нет счастья";
	конецесли;
	
	up=arr.ВГраница();
	
	//в таблицу результат будем заносить найденные варианты
	результат=новый ТаблицаЗначений;
	результат.Колонки.Добавить("Длина");
	результат.Колонки.Добавить("Позиция");
	результат.Колонки.Добавить("Текст");
	
	
	//двигаемся по массиву букв
	для i=0 по  up цикл
		//с позиции, в которой присутствует непустой символ начинаем поиск подстроки
		если arr[i]<>"" тогда  
			T=arr[i];
			
			//выгружаем исходное слово в массив
			проверка=буфер.ВыгрузитьКолонку(0);	
			j=проверка.Найти(arr[i]);
			проверка.Удалить(j)    ;
			для j=i+1 по up цикл
				если arr[j]<>"" тогда    
					n=проверка.Найти(arr[j]);
					если n<>неопределено тогда  
						//каждую найденную букву удаляем из массива проверка
						проверка.Удалить(n)    ;
						если проверка.Количество()=0 тогда  //массив пустой, значит нашлись все буквы
							//заносим данные подстроки в таблицу результат
							приемник=результат.Добавить();
							приемник.Позиция=i+1;
							приемник.Длина  =j-i+1;
							приемник.Текст  =Сред(ИсходныеДанные,приемник.Позиция,приемник.Длина);
							прервать;
						конецесли;	  
					конецесли; 
				конецесли;	 
			конеццикла;	
		конецесли;
	конеццикла;	
	
	результат.Сортировать("Длина,Позиция");
	возврат  результат[0].Текст;
	
КонецФункции


Показать
user1847230; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот