Created
December 25, 2017 15:13
-
-
Save TheMY3/5b45a1605bfef7461a99ab3b63198a1d to your computer and use it in GitHub Desktop.
Интересное тестовое задание.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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