You are given two strings, s
and t
.
You can create a new string by selecting a substring from s
(possibly empty) and a substring from t
(possibly empty), then concatenating them in order.
Return the length of the longest palindrome that can be formed this way.
Example 1:
Input: s = "a", t = "a" Output: 2 Explanation: Concatenating "a" from s and "a" from t results in "aa", which is a palindrome of length 2.
Example 2:
Input: s = "abc", t = "def" Output: 1 Explanation: Since all characters are different, the longest palindrome is any single character, so the answer is 1.
Example 3:
Input: s = "b", t = "aaaa" Output: 4 Explanation: Selecting "aaaa" from t is the longest palindrome, so the answer is 4.
Example 4:
Input: s = "abcde", t = "ecdba" Output: 5 Explanation: Concatenating "abc" from s and "ba" from t results in "abcba", which is a palindrome of length 5.
Constraints:
1 <= s.length, t.length <= 30 s and t consist of lowercase English letters.
A brute-force solution would involve generating all possible substrings from both strings s
and t
, concatenating each pair, and then checking if the resulting string is a palindrome. We keep track of the longest palindrome found so far.
def is_palindrome(s):
return s == s[::-1]
def longest_palindrome_substring_naive(s, t):
max_len = 0
for i in range(len(s) + 1):
for j in range(i, len(s) + 1):
sub_s = s[i:j]
for k in range(len(t) + 1):
for l in range(k, len(t) + 1):
sub_t = t[k:l]
combined = sub_s + sub_t
if is_palindrome(combined):
max_len = max(max_len, len(combined))
return max_len
# Example Usage
s = "abcde"
t = "ecdba"
print(longest_palindrome_substring_naive(s, t)) # Output: 5
s = "a"
t = "a"
print(longest_palindrome_substring_naive(s, t)) # Output: 2
s = "abc"
t = "def"
print(longest_palindrome_substring_naive(s, t)) # Output: 1
s = "b"
t = "aaaa"
print(longest_palindrome_substring_naive(s, t)) # Output: 4
We can use dynamic programming to optimize this. The main idea is to create a DP table that stores the lengths of the longest palindromic substrings formed by combining prefixes of s
and t
. Instead of generating substrings and checking, we build up the palindromes iteratively.
def longest_palindrome_substring_dp(s, t):
n, m = len(s), len(t)
max_len = 0
# Check palindromes formed only by s
for i in range(n):
# Odd length palindromes centered at i
l, r = i, i
while l >= 0 and r < n and s[l] == s[r]:
max_len = max(max_len, r - l + 1)
l -= 1
r += 1
# Even length palindromes centered between i and i+1
l, r = i, i + 1
while l >= 0 and r < n and s[l] == s[r]:
max_len = max(max_len, r - l + 1)
l -= 1
r += 1
# Check palindromes formed only by t
for i in range(m):
# Odd length palindromes centered at i
l, r = i, i
while l >= 0 and r < m and t[l] == t[r]:
max_len = max(max_len, r - l + 1)
l -= 1
r += 1
# Even length palindromes centered between i and i+1
l, r = i, i + 1
while l >= 0 and r < m and t[l] == t[r]:
max_len = max(max_len, r - l + 1)
l -= 1
r += 1
# Check palindromes formed by combining s and t
for i in range(n + 1):
for j in range(m + 1):
# Consider s[:i] + t[j:]
combined = s[:i] + t[m-j:]
if is_palindrome(combined):
max_len = max(max_len, len(combined))
return max_len
# Example Usage
s = "abcde"
t = "ecdba"
print(longest_palindrome_substring_dp(s, t)) # Output: 5
s = "a"
t = "a"
print(longest_palindrome_substring_dp(s, t)) # Output: 2
s = "abc"
t = "def"
print(longest_palindrome_substring_dp(s, t)) # Output: 1
s = "b"
t = "aaaa"
print(longest_palindrome_substring_dp(s, t)) # Output: 4
s
and t
, resulting in O(n^2 * m^2) combinations. For each combination, it checks if the combined string is a palindrome, which takes O(n+m) time. Therefore, the overall time complexity is O(n^2 * m^2 * (n+m)).s
and t
, which takes O(n^2) and O(m^2) respectively. Then it checks some combinations of substrings of s
and t
. The number of combinations could be up to O(nm). The palindrome check takes O(n+m). Therefore, the worst case complexity becomes O(n^2 + m^2 + nm*(n+m)), which simplifies to O((n+m)^3) in the worst case. This can be further optimized if we consider only relevant combinations.s
and t
are empty, the longest palindrome is an empty string, so the length is 0.