У меня есть коллекция строк, и мне нужно знать первый индекс, где они все различаются. Я могу подумать о двух способах сделать это: (следующий псевдокод просто не в моей голове и может быть сильно загружен ошибками)
Первый путь:
var minLength = [go through all strings finding min length];
var set = new set()
for(i=0;i<minlength;i++)
{
for(str in strings)
{
var substring = str.substring(0,i);
if(set.contains(substring))
break; // not all different yet, increment i
set.add(substring)
}
set.clear(); // prepare for next length of substring
}
Это кажется мне грубым из-за использования заданной структуры данных, когда кажется, что она не нужна.
Второй способ:
var minLength = [go through all strings finding min length];
strings.sort();
for(i=0;i<minlength;i++)
{
boolean done = true;
char last = null;
for(str in strings)
{
char c = str[i];
if(c == last)
{
// not all different yet, increment i
done = false;
break;
}
last = c;
}
if(done)
return i;
}
Но меня раздражает, что мне сначала нужно запустить сортировку, потому что алгоритм сортировки по самой своей природе имеет доступ к информации, которую я ищу.
Конечно, должен быть более эффективный способ, чем тот, который я перечислил выше. В конце концов я хотел бы абстрагировать его для любого типа массива, но это будет тривиально, и его проще воспринимать как строковую проблему.
Любая помощь?
** ОБНОВЛЕНИЕ: Я очевидно не очень хорошо объяснил себя. Если мои строки - ["apple", "banana", "cucumber", "banking"], я хочу, чтобы функция возвращала 3, потому что было две строки ("banana" и "banking"), которые соответствовали индексу 0, 1 и 2, поэтому 3 - это первый индекс, в котором они все уникальны.
Как Дэниел упоминал ниже, лучший способ заявить о моих потребностях заключается в следующем: «Я хочу найти индекс i, в котором вызов подстроки (0, i) для всех моих строк приведет к получению всех уникальных значений». **