Задачка по PHP , на обработку/классификацию строк.
Необходимо написать функцию, которая принимает на вход массив со списком слов
и возвращает сгруппированные слова.
К одной группе относятся слова, которые могут быть получены одно из другого
с помощью произвольной перестановки букв. (см. примеры ниже)
Пример работы функции:
<?php
/*
Необходимо написать функцию, которая принимает на вход массив со списком слов
и возвращает сгруппированные слова.
К одной группе относятся слова, которые могут быть получены одно из другого
с помощью произвольной перестановки букв.
Например:
makeGroups( array('rfv', 'vfr', 'abc', 'bac', 'dbatre', 'qwer', 'cba', 'terbda') )
Вернет:
array(
array('rfv', 'vfr'),
array('abc', 'bac', 'cba'),
array('dbatre', 'terbda'),
array('qwer'),
)
Здесь rfv получается из vfr с помощью перестановки v и r, а из слов abc,
bac и cba формируется общая группа,
потому что любое из этих слов превращается в соседнее путём одной
или нескольких перестановок букв.
Протестируйте свой код.
*/
function makeGroups(array $words): array {
return [
['rfv', 'vfr'],
['abc', 'bac', 'cba'],
['dbatre', 'terbda'],
['qwer'],
];
};
$r = makeGroups( array('rfv', 'vfr', 'abc', 'bac', 'dbatre', 'qwer', 'cba', 'terbda') );
print_r($r);
exit;
Мое решение:
<?php
/**
* Calc string hah
* @param string $word
* @return string
*/
function calcHash(string $word): string
{
$hash = '';
$cnt = [];
for($i = 0; $i < mb_strlen($word); $i++) {
$chr = mb_substr($word, $i, 1);
if(isset($cnt[$chr])) {
$cnt[$chr]++;
} else {
$cnt[$chr] = 1;
}
}
ksort($cnt);
$hash = md5(json_encode($cnt));
return $hash;
}
/**
* Make words groups
* @param array $words
* @return array
*/
function makeGroups(array $words): array
{
$ret = [];
foreach($words as $word) {
$hash = calcHash($word);
//echo "Hash for $word: $hashn";
$ret[$hash][] = $word;
}
return array_values($ret);
};
$r = makeGroups( array('rfv', 'vfr', 'abc', 'bac', 'dbatre', 'qwer', 'cba', 'terbda') );
print_r($r);
exit;
~ Я решил за ~50 мин, вкл. обсуждение
Нет Ответов