-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLongestPalindromicSubstring.kt
152 lines (125 loc) · 4.56 KB
/
LongestPalindromicSubstring.kt
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package problems
class LongestPalindromicSubstring {
//Expand Around Center - Quite optimal solution of O(n^2)... but Manacher's algorithm could do it in O(n)
fun longestPalindrome(s: String): String {
var startIndex = 0
var endIndex = 0
for (i in 0 until s.length) {
var tempStart = i
var tempEnd = i
for (j in i + 1 until s.length) {
if (s[i] == s[j]){
tempEnd++
} else {
break
}
}
while (tempStart > 0 && tempEnd < s.length - 1) {
val leftChar = s[tempStart - 1]
val rightChar = s[tempEnd + 1]
if (leftChar == rightChar) {
tempStart--
tempEnd++
} else {
break
}
}
val currentLength = tempEnd - tempStart + 1
val maxLength = endIndex - startIndex + 1
if (currentLength > maxLength) {
endIndex = tempEnd
startIndex = tempStart
}
}
return s.substring(startIndex, endIndex + 1)
}
fun longestPalindromeWithString(s: String): String {
var longestPalindrome = s[0].toString()
for (i in 0 until s.length) {
var leftPointer = i - 1
var rightPointer = i
var palindrome = ""
for (j in i until s.length) {
if (s[i] == s[j]){
palindrome += s[j]
rightPointer++
} else {
break
}
}
while (true) {
if (leftPointer >= 0 && rightPointer < s.length) {
val leftChar = s[leftPointer]
val rightChar = s[rightPointer]
if (leftChar == rightChar) {
leftPointer--
rightPointer++
palindrome = leftChar + palindrome + rightChar
} else {
break
}
} else {
break
}
}
if (palindrome.length > longestPalindrome.length) {
longestPalindrome = palindrome
}
}
return longestPalindrome
}
fun longestPalindromeScratch(s: String): String {
var longestPalindrome = ""
for (i in 0 until s.length) {
//double mirror 이랍치고,, 두번 계산해서 큰걸로 가져왔어야했음...
if (i < s.length - 1 && s[i] == s[i + 1]) {
//case 1: double mirror
var leftPointer = i - 1
var rightPointer = i + 2
var palindrome = "${s[i]}${s[i + 1]}"
while (true) {
if (leftPointer >= 0 && rightPointer < s.length) {
val leftChar = s[leftPointer]
val rightChar = s[rightPointer]
if (leftChar == rightChar) {
leftPointer--
rightPointer++
palindrome = leftChar + palindrome + leftChar
} else {
break
}
} else {
break
}
}
if (palindrome.length > longestPalindrome.length) {
longestPalindrome = palindrome
}
} else {
//case 2: single mirror
var leftPointer = i - 1
var rightPointer = i + 1
var palindrome = s[i].toString()
while (true) {
if (leftPointer >= 0 && rightPointer < s.length) {
val leftChar = s[leftPointer]
val rightChar = s[rightPointer]
if (leftChar == rightChar) {
leftPointer--
rightPointer++
palindrome = leftChar + palindrome + leftChar
} else {
break
}
} else {
break
}
}
if (palindrome.length > longestPalindrome.length) {
longestPalindrome = palindrome
}
}
}
return longestPalindrome
}
}