Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions string_manipulation/longest.palindromic.subsequence.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Longest Palindromic Subsequence in R
# Author: sgindeed
# Description: Finds and prints the longest palindromic subsequence and its length

# Ask for user input
input.string <- readline(prompt = "Enter a string: ")

# Convert string to lowercase for consistency
clean.string <- tolower(input.string)

# Get length of string
n <- nchar(clean.string)

# Split string into characters
chars <- strsplit(clean.string, "")[[1]]

# Initialize DP table for lengths
dp <- matrix(0, nrow = n, ncol = n)

# Each single character is a palindrome of length 1
for (i in seq_len(n)) {
dp[i, i] <- 1
}

# Fill the DP table
for (cl in 2:n) {
for (i in 1:(n - cl + 1)) {
j <- i + cl - 1
if (chars[i] == chars[j] && cl == 2) {
dp[i, j] <- 2
} else if (chars[i] == chars[j]) {
dp[i, j] <- dp[i + 1, j - 1] + 2
} else {
dp[i, j] <- max(dp[i + 1, j], dp[i, j - 1])
}
}
}

# Function to reconstruct the subsequence
reconstructLPS <- function(chars, dp, i, j) {
if (i > j) {
return("")
}
if (i == j) {
return(chars[i])
}
if (chars[i] == chars[j]) {
return(paste0(chars[i], reconstructLPS(chars, dp, i + 1, j - 1), chars[j]))
}
if (dp[i + 1, j] > dp[i, j - 1]) {
return(reconstructLPS(chars, dp, i + 1, j))
} else {
return(reconstructLPS(chars, dp, i, j - 1))
}
}

# Get the longest palindromic subsequence
lps <- reconstructLPS(chars, dp, 1, n)

# Display the result
cat("Longest Palindromic Subsequence:", lps, "\n")
cat("Length:", nchar(lps), "\n")