File tree Expand file tree Collapse file tree 1 file changed +44
-0
lines changed
longest-palindromic-substring Expand file tree Collapse file tree 1 file changed +44
-0
lines changed Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments