type
//Сведения о слове.
TWord = record
SWord : String; //Слово.
Cnt : Integer; //Сколько раз слово встречается в тексте.
end;
//Возвращает строку, содержащую список слов, которые в исходном
//тексте присутствуют наиболее часто.
function ProcStr(const aStr : String) : String;
const
//Разделители слов.
D = ['.', ',', ':', ';', '!', '?', '-', ' ', #9, #10, #13];
//Величина приращения длины динамического массива.
Capacity = 10;
var
Arr : array of TWord; //Массив уникальных слов.
SWord : String;
i, j, Len, LenW, Cnt, CntMax : Integer;
begin
Result := '';
//Извлекаем слова и добавляем их в массив.
Len := Length(aStr); //Длина строки.
LenW := 0; //Длина очередного слова.
Cnt := 0; //Количество значимых элементов в массиве.
CntMax := 0; //Наибольшее количество присутствий слова в массиве.
for i := 1 to Len do begin
//Пропускаем разделители.
if aStr[i] in D then Continue;
//Учитываем символ в длине слова.
Inc(LenW);
//Отслеживаем конец слова.
if (i = Len) or (aStr[i + 1] in D) then begin
//Получаем очередное слово из текста. Буквы слова делаем заглавными.
SWord := AnsiUpperCase( Copy(aStr, i - LenW + 1, LenW) );
//Ищем слово в массиве.
j := 0;
while j < Cnt do begin
//Если слово обнаружено в массиве.
if Arr[j].SWord = SWord then begin
//Увеличиваем счётчик данного слова на 1.
Inc(Arr[j].Cnt);
Break;
end;
//Переход к следующему элементу массива.
Inc(j);
end;
//Если j = Cnt, то слова нет в массиве. В этом случае добавляем слово в массив.
if j = Cnt then begin
//Количество значимых элементов массива теперь увеличилось на 1.
Inc(Cnt);
//Если требуется, увеличиваем длину массива.
if Cnt > Length(Arr) then SetLength(Arr, Cnt + Capacity);
//Добавляем сведения о слове в массив.
Arr[j].SWord := SWord;
Arr[j].Cnt := 1;
end;
//Уточняем сведения о наибольшем количестве присутствий слова.
if Arr[j].Cnt > CntMax then CntMax := Arr[j].Cnt;
//Сброс длины слова.
LenW := 0;
end;
end;
//Записываем в результирующую строку только те слова,
//которые присутствуют в тексте наиболее часто.
Result := '';
for i := 0 to Cnt - 1 do
if Arr[i].Cnt = CntMax then begin
if Result <> '' then Result := Result + ', ';
Result := Result + Arr[i].SWord;
end;
end;
//Проверка.
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo2.Text := ProcStr(Memo1.Text);
end;