Skip to content

Instantly share code, notes, and snippets.

@TheMY3
Created December 25, 2017 15:13
Show Gist options
  • Save TheMY3/5b45a1605bfef7461a99ab3b63198a1d to your computer and use it in GitHub Desktop.
Save TheMY3/5b45a1605bfef7461a99ab3b63198a1d to your computer and use it in GitHub Desktop.
Интересное тестовое задание.
<?php
/*
Дана строка текста.
Написать программу на рнр, которая определяет является ли строка текста палиндромом (читается с обоих сторон одинаково)
и осуществляет вывод строки следующим способом:
а) если строка является палиндромом, то она выводится полностью.
б) если строка не является палиндромом - выводится самый длинный под-палиндром этой строки, т.е. самая длинная часть строки,
являющаяся палиндромом
в) если подпалиндромы отсутствуют в строке - выводится первый символ строки.
Примеры палиндромов: - Аргентина манит негра
- Sum summus mus
*/
/* Set internal character encoding to UTF-8 */
mb_internal_encoding("UTF-8");
class Palindrome
{
/**
* @param string $rawString
* @return string
*/
public function find(string $rawString): string
{
$sentence = $this->convertString($rawString);
// a) If given string palindrome - return original string.
if ($this->isPalindrome($sentence)) {
return $rawString;
}
$parts = $this->findParts($sentence);
// b) Return part of given string which is palindromee.
if (!empty($parts)) {
return $this->longestPart($parts);
}
// c) Nothing found, retrun firts char of original string.
return mb_substr($rawString, 0, 1);
}
/**
* Check if given string is palindrome.
*
* @param string $string
* @return bool
*/
private function isPalindrome(string $string): bool
{
return $string === $this->reverseString($string);
}
/**
* Convert to simple string.
*
* @param string $rawString
* @return string
*/
private function convertString(string $rawString): string
{
return mb_strtolower(str_replace(' ', '', $rawString));
}
/**
* Find palindroms in given string.
*
* @param string $sentence
* @return array
*/
private function findParts(string $sentence): array
{
$strLength = mb_strlen($sentence);
$parts = [];
for ($i = 1; $i < $strLength - 1; $i++) {
for ($j = $strLength - $i; $j > 1; $j--) {
$part = mb_substr($sentence, $i, $j);
if ($this->isPalindrome($part)) {
$parts[] = $part;
}
}
}
return $parts;
}
/**
* Reverse a string with utf-8 support.
*
* @param string $string
* @return string
* @link http://php.net/manual/en/function.strrev.php#62422
*/
private function reverseString(string $string): string
{
preg_match_all('/./us', $string, $words);
return join('', array_reverse($words[0]));
}
/**
* Return longest part from parts array.
*
* @param array $parts
* @return string
* @link https://twigstechtips.blogspot.com/2009/12/php-get-longest-string-or-length-in.html
*/
private function longestPart(array $parts): string
{
$mapping = array_combine($parts, array_map('strlen', $parts));
return array_keys($mapping, max($mapping))[0];
}
}
$sentences = [
'Аргентина манит негра',
'Sum summus mus',
'Just string',
'string'
];
$class = new Palindrome();
foreach ($sentences as $sentence) {
echo 'Original string: ' . $sentence . PHP_EOL;
echo 'Palindrome: ' . $class->find($sentence) . PHP_EOL;
echo PHP_EOL;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment