/
5.longest-palindromic-substring.php
116 lines (95 loc) · 2.88 KB
/
5.longest-palindromic-substring.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?php
namespace LeetCode\LongestPalindromicSubstring;
require __DIR__ . '/vendor/autoload.php';
/*
* @lc app=leetcode id=5 lang=php
*
* [5] Longest Palindromic Substring
*/
// @lc code=start
class Solution
{
/**
* @param string $string
* @return string
*/
public function longestPalindrome($string)
{
$answer = "";
for ($i = 0; $i < strlen($string); $i++) {
$oddPalindrome = $this->findOddPalindrome($string, $i);
if (strlen($oddPalindrome) > strlen($answer)) {
$answer = $oddPalindrome;
}
}
for ($i = 0; $i < strlen($string); $i++) {
$evenPalindrome = $this->findEvenPalindrome($string, $i);
if (strlen($evenPalindrome) > strlen($answer)) {
$answer = $evenPalindrome;
}
}
return $answer;
}
private function findOddPalindrome($string, $start)
{
$answer = $string[$start];
$left = $start - 1;
$right = $start + 1;
while ($left >= 0 && $right < strlen($string)) {
if ($string[$left] == $string[$right]) {
$answer = substr($string, $left, $right - $left + 1);
$left--;
$right++;
continue;
} else {
break;
}
}
return $answer;
}
private function findEvenPalindrome($string, $start)
{
$answer = '';
if ($start == 0) {
if (strlen($string) > 1 && $string[$start] == $string[$start + 1]) {
$answer = $string[$start] . $string[$start + 1];
}
return $answer;
}
if ($start == strlen($string) - 1) {
if (strlen($string) > 1 && $string[$start - 1] == $string[$start]) {
$answer = $string[$start - 1] . $string[$start];
}
return $answer;
}
if ($start == 0 || $start == strlen($string) - 1) {
return $answer;
}
if ($string[$start - 1] == $string[$start]) {
$answer = $string[$start - 1] . $string[$start];
$left = $start - 2;
$right = $start + 1;
} else if ($string[$start] == $string[$start + 1]) {
$answer = $string[$start] . $string[$start + 1];
$left = $start - 1;
$right = $start + 2;
} else {
return $answer;
}
while ($left >= 0 && $right < strlen($string)) {
if ($string[$left] == $string[$right]) {
$answer = substr($string, $left, $right - $left + 1);
$left--;
$right++;
continue;
} else {
break;
}
}
return $answer;
}
}
// @lc code=end
$solution = new Solution();
$answer = $solution->longestPalindrome('abbacc');
dump($answer);