Вопрос был - "можно ли организовать поиск, не перебирая все элементы". Ответ: можно в сортированном (хотя бы по первым буквам) массиве.
Простейший вариант:
Идем по массиву, ищем первую букву.
Код:
i := 0;
while i < length(arr) do
begin
if arr[i][0] > s[0] then
begin
i := length(arr);
break;
end;
if arr[i][0] = s[0] then
break;
i := i + 1;
end;
if i >= length(arr) then exit; // нет строки
Либо дошли до конца, либо нашли индекс первой строки, в которой совпадает первая буква.
Далее ищем саму строку, пока первые символы совпадают:
Код:
while i < length(arr) do
begin
if arr[i][0] > s[0] then
begin
i := length(arr);
break;
end;
if arr[i] = s then
begin
foundIndex := i;
break;
end;
i := i + 1;
end;
Теперь foundIndex содержит номер строки.