Skip to content

Commit 38a1997

Browse files
committed
Add Longest Palindrom in a String
1 parent dc242ad commit 38a1997

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
fun longestPalindromInAString(s: String): String {
2+
val n = s.length
3+
if (n == 0) {
4+
return ""
5+
}
6+
val dp = Array(n) { BooleanArray(n) }
7+
var maxLen = 1
8+
var startIndex = 0
9+
// Base case: a single character is always a palindrome.
10+
for (i in 0 until n) {
11+
dp[i][i] = true
12+
}
13+
// Base case: a substring of length two is a palindrome if both
14+
// characters are the same.
15+
for (i in 0 until n - 1) {
16+
if (s[i] == s[i + 1]) {
17+
dp[i][i + 1] = true
18+
maxLen = 2
19+
startIndex = i
20+
}
21+
}
22+
// Find palindromic substrings of length 3 or greater.
23+
for (substringLen in 3..n) {
24+
// Iterate through each substring of length 'substringLen'.
25+
for (i in 0 until n - substringLen + 1) {
26+
val j = i + substringLen - 1
27+
// If the first and last characters are the same, and the
28+
// inner substring is a palindrome, then the current
29+
// substring is a palindrome.
30+
if (s[i] == s[j] && dp[i + 1][j - 1]) {
31+
dp[i][j] = true
32+
maxLen = substringLen
33+
startIndex = i
34+
}
35+
}
36+
}
37+
return s.substring(startIndex, startIndex + maxLen)
38+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
fun longestPalindromeInAStringExpanding(s: String): String {
2+
val n = s.length
3+
var start = 0
4+
var maxLen = 0
5+
for (center in 0 until n) {
6+
// Check for odd-length palindromes.
7+
val (oddStart, oddLength) = expandPalindrome(center, center, s)
8+
if (oddLength > maxLen) {
9+
start = oddStart
10+
maxLen = oddLength
11+
}
12+
// Check for even-length palindromes.
13+
if (center < n - 1 && s[center] == s[center + 1]) {
14+
val (evenStart, evenLength) = expandPalindrome(center, center + 1, s)
15+
if (evenLength > maxLen) {
16+
start = evenStart
17+
maxLen = evenLength
18+
}
19+
}
20+
}
21+
return s.substring(start, start + maxLen)
22+
}
23+
24+
// Expands outward from the center of a base case to identify the start
25+
// index and length of the longest palindrome that extends from this
26+
// base case.
27+
fun expandPalindrome(left: Int, right: Int, s: String): Pair<Int, Int> {
28+
var l = left
29+
var r = right
30+
while (l > 0 && r < s.length - 1 && s[l - 1] == s[r + 1]) {
31+
l--
32+
r++
33+
}
34+
return l to r - l + 1
35+
}

0 commit comments

Comments
 (0)