Skip to content

Commit bd3c898

Browse files
authored
longest palindromic substring solution
1 parent e4afccc commit bd3c898

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import scala.collection.mutable.ArrayBuffer
2+
3+
object Solution {
4+
def longestPalindrome(s: String): String = {
5+
val list = ArrayBuffer[Char]()
6+
for (c <- s) {
7+
list += c
8+
list += '\u0000'
9+
}
10+
val dp = Array.fill(list.size - 1)(0)
11+
var lastR = -1
12+
var lastMid = -1
13+
var maxD = 0
14+
var ansL = 0
15+
var ansR = 0
16+
var i = 1
17+
for (i <- 0 until dp.size) { // Manacher T(n) = S(n) = O(n)
18+
val diff = lastR - i
19+
var d = if (diff <= 0) 0 else diff min dp((lastMid << 1) - i)
20+
var l = i - d
21+
var r = i + d
22+
while (l != 0 && r != list.size - 1 && list(l - 1) == list(r + 1)) {
23+
d += 1
24+
l -= 1
25+
r += 1
26+
}
27+
if (maxD < d) {
28+
maxD = d
29+
ansL = l
30+
ansR = r
31+
}
32+
dp(i) = d
33+
if (lastR < r) {
34+
lastR = r
35+
lastMid = i
36+
}
37+
}
38+
val sb = StringBuilder()
39+
for (i <- ansL to ansR if list(i) != '\u0000') {
40+
sb.append(list(i))
41+
}
42+
sb.toString
43+
}
44+
}

0 commit comments

Comments
 (0)