Сравнение строк с использованием хэша

0

Поэтому я просто вышел из отличного интервью, в котором мне довелось бросить мяч к концу. Тестирование, которое я получил, касалось решения простого вопроса CS.

У вас есть две укусы $a = 'abcd'; $b = 'cdfg'; $a = 'abcd'; $b = 'cdfg';

Используя наиболее эффективный метод, мне было предложено сравнить эти две строки и вернуть любые совпадающие символы. В то время наиболее очевидным (и наименее эффективным) решением было следующее.

'

$matches = array();
$length = strlen($a);
for($i = 0; $i < $length; $i++) {
    if(strpos($b, $a[$i]) !== false) {
        $matches[] = $a[$i];
    }
}

return $matches;

Мне сообщили, что правильное и эффективное решение требует использования хешей.
Может кто-нибудь прокомментировать?

редактировать:

Возвращаемое значение в этом примере должно быть "cd".

Мне сказали, что использование PHP-методов, таких как "array_intersect", будет считаться обманом.

  • 1
    что вы подразумеваете под "любыми подходящими символами"? Есть общие персонажи? Любые символы, которые совпадают в той же позиции? Что-то другое? Неточные описания тратят впустую время каждого.
  • 0
    В этом примере возвращаемое значение было бы "CD".
Показать ещё 5 комментариев
Теги:
performance
algorithm
hash
compare

1 ответ

1

Ваше решение - O(strlen($a) * strlen($b)), поскольку strpos() возможно, придется искать все $b, чтобы найти конкретный символ. "Хеширование", я предполагаю, что они означают "сохранение символов $a в хэш-таблице":

$a_hash = array();
$length = strlen($a);
for ($i = 0; $i < $length; $i++) {
    $a_hash[$a[$i]] = true;
}
$matches = array();
$length = strlen($b);
for ($i = 0; $i < $length; $i++) {
   if (array_key_exists($a_hash, $b[$i])) {
       $matches[] = $b[$i];
   }
}
return $matches;

Предполагая, что операции хэш-таблицы (используя PHP infamous array()) являются постоянными, это теперь O(strlen($a) + strlen($b)).

  • 1
    Я не могу поверить, насколько чертовски очевидно это решение. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню