Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.01.2012, 10:34
serebrus serebrus вне форума
Прохожий
 
Регистрация: 22.12.2011
Сообщения: 26
Репутация: 10
По умолчанию Похожее часть слова

Привет всем.
Допустим имеются несколько слов: 1. маршрут 2. ашот 3. миршот, ... Также задано ключевое слово: март.
Есть ли возможность получить только похожую часть всех слов. Ожидаемый результат: 1. март 2. ат 3. мрт
Пробовал регулярным выражением типа: м*а*р*т*.
Результат такой:
1. мар
2. р
3. т
4. а
5.
6. т
7. м
8. р
9.
10. т
Ответить с цитированием
  #2  
Старый 05.01.2012, 10:42
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Что понимается под "получить только похожую часть"? Если нет правила, то у вас одно понятие, у меня другое, у компьютера третье.
Хотя догадываюсь: ищется первая буква из шаблона, если нет, то следующая. Как только она находится, у шаблона эта буква изымается из поиска, переходим к следующей, а поиск продолжается с нового места.

Последний раз редактировалось AlexSku, 05.01.2012 в 10:58.
Ответить с цитированием
  #3  
Старый 05.01.2012, 11:01
serebrus serebrus вне форума
Прохожий
 
Регистрация: 22.12.2011
Сообщения: 26
Репутация: 10
По умолчанию

Я же показал пример, надо чтою результат был таким: март, ат, мрт
А у меня получается:
мар
р
т
а

т
м
р

т
Ответить с цитированием
  #4  
Старый 05.01.2012, 11:18
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  Pattern, S, Res: String;
  I, J: Integer;
begin
  Pattern:= AnsiUpperCase(Edit1.Text);  // 'Март'
  S:= AnsiUpperCase(Edit2.Text);        // Можно из ListBox, Memo...
  Res:= '';
  J:= 1;
  for I:= 1 to Length(Pattern) do
  begin
    J:= Pos(Pattern[i], S);
    if J > 0 then
    begin
      Res:= Res + Pattern[i];
      Delete(S, J, 1);
      if S = '' then Break;
    end;
  end;
  Edit3.Text:= Res;
end;
Ответить с цитированием
  #5  
Старый 05.01.2012, 11:58
serebrus serebrus вне форума
Прохожий
 
Регистрация: 22.12.2011
Сообщения: 26
Репутация: 10
По умолчанию

Хороший код, но он меняет местами букв. Например: Pattern:='shina' S:='hasan'. hasan становится shna, а должно было hasn
Ответить с цитированием
  #6  
Старый 05.01.2012, 14:40
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Если что не так, то код плохой. Нашёл ошибку, надо:
Код:
Delete(S, 1, J);
Но у меня получается SN. Если у вас другой алгоритм, поясните, почему должно получится HASN. Или расположение букв не важно?
Если надо сравнить общие буквы, то алгоритм такой: первое слово это множество букв, второе слово это другое множество букв, совпадение это пересечение множеств (Set1 * Set2).

Последний раз редактировалось AlexSku, 05.01.2012 в 14:45.
Ответить с цитированием
  #8  
Старый 06.01.2012, 11:30
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

А всё-таки вы не ответили, что вы понимаете под "найти похожую часть слов". У меня, кстати, есть реализация другого алгоритма (Боера-Мура), вычисляющую степень похожести, как и ваш алгоритм Левенштейна, но неохота его искать, не зная, для какой задачи вы ищете решение.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:47.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter