Перебирая задачи, которые дают на собеседовании, наткнулся на следующую. В заданном тексте найти наименьшую подстроку, которая содержит все буквы из слова счастье. Порядок букв и регистр неважен. Если таких подстрок несколько, то найти ближайшую к началу текста. Кроме перебора с контролем ничего другого не придумал. Какие есть идеи ?
Ну, если исходить из того, что это собеседование и долго думать некогда, то вот такой вариант:
Помещаем слова в тз (в пару приоритет, слово), потом в запросе используем регулярные выражения:
ВЫБРАТЬ
ТЗ.Приритет, ТЗ.слово
Поместить ВТ
ИЗ &ТЗ как ТЗ
ВЫБРАТЬ ПЕРВЫЕ 1 ВТ.* ИЗ ВТ ГДЕ слово Подобно "%с%Ч%а%с%т%ь%е%"
Упорядочить ПО Приоритет;
Более быстрый вариант в практической работе - использовать нормальные регулярные выражения, можно даже более-менее стандартно - добавляем html поле с JavaScript и используем его возможности.
Функция НайтиСчастье(ИсходныеДанные,слово="счастье")
вхСтрока=нрег(ИсходныеДанные);
проверка=новый массив ;
//создадим таблицу в первой колонке, которой будет храниться искомое слово
буфер =новый ТаблицаЗначений;
буфер.Колонки.Добавить();
для 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].Текст;
КонецФункции