-
Notifications
You must be signed in to change notification settings - Fork 0
/
RightBorderTask.cs
36 lines (34 loc) · 1.58 KB
/
RightBorderTask.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
namespace Autocomplete
{
public class RightBorderTask
{
/// <returns>
/// Возвращает индекс правой границы.
/// То есть индекс минимального элемента, который не начинается с prefix и большего prefix.
/// Если такого нет, то возвращает items.Length
/// </returns>
/// <remarks>
/// Функция должна быть НЕ рекурсивной
/// и работать за O(log(items.Length)*L), где L — ограничение сверху на длину фразы
/// </remarks>
public static int GetRightBorderIndex(IReadOnlyList<string> phrases, string prefix, int left, int right)
{
var middle = 0;
if (prefix.Length == 0 || phrases.Count == 0) return phrases.Count;
while (right - left != 1)
{
middle = left + (right - left) / 2;
if (string.Compare(prefix, phrases[middle], StringComparison.OrdinalIgnoreCase) >= 0
|| phrases[middle].StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
left = middle;
else right = middle;
}
if (string.Compare(prefix, phrases[middle], StringComparison.OrdinalIgnoreCase) < 0
&& !phrases[middle].StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
return middle;
return middle + 1;
}
}
}