-
Notifications
You must be signed in to change notification settings - Fork 4.9k
/
MaximizePalindromeLengthFromSubsequences.cpp
104 lines (93 loc) · 3.5 KB
/
MaximizePalindromeLengthFromSubsequences.cpp
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
// Source : https://leetcode.com/problems/maximize-palindrome-length-from-subsequences/
// Author : Hao Chen
// Date : 2021-03-27
/*****************************************************************************************************
*
* You are given two strings, word1 and word2. You want to construct a string in the following manner:
*
* Choose some non-empty subsequence subsequence1 from word1.
* Choose some non-empty subsequence subsequence2 from word2.
* Concatenate the subsequences: subsequence1 + subsequence2, to make the string.
*
* Return the length of the longest palindrome that can be constructed in the described manner. If no
* palindromes can be constructed, return 0.
*
* A subsequence of a string s is a string that can be made by deleting some (possibly none)
* characters from s without changing the order of the remaining characters.
*
* A palindrome is a string that reads the same forward as well as backward.
*
* Example 1:
*
* Input: word1 = "cacb", word2 = "cbba"
* Output: 5
* Explanation: Choose "ab" from word1 and "cba" from word2 to make "abcba", which is a palindrome.
*
* Example 2:
*
* Input: word1 = "ab", word2 = "ab"
* Output: 3
* Explanation: Choose "ab" from word1 and "a" from word2 to make "aba", which is a palindrome.
*
* Example 3:
*
* Input: word1 = "aa", word2 = "bb"
* Output: 0
* Explanation: You cannot construct a palindrome from the described method, so return 0.
*
* Constraints:
*
* 1 <= word1.length, word2.length <= 1000
* word1 and word2 consist of lowercase English letters.
******************************************************************************************************/
/*
// The basic algorthim come from
// https://leetcode.com/problems/longest-palindromic-subsequence/
int longestPalindromeSubseq(string& s) {
int n = s.size();
vector<vector<int>> dp(n, vector<int>(n, 0));
for (int start = n-1; start>=0; start--) {
for (int end = start ; end < n ; end++) {
if (start == end) {
dp[start][end] = 1;
continue;
}
if (s[start] == s[end]) {
dp[start][end] = dp[start+1][end-1] + 2;
}else{
dp[start][end] = max (dp[start+1][end], dp[start][end-1]);
}
}
}
return dp[0][n-1];
}
*/
class Solution {
public:
int longestPalindrome(string word1, string word2) {
string s = word1 + word2;
int n = s.size();
vector<vector<int>> dp(n, vector<int>(n, 0));
int result = 0;
for (int start = n-1; start>=0; start--) {
for (int end = start ; end < n ; end++) {
if (start == end) {
dp[start][end] = 1;
continue;
}
if (s[start] == s[end]) {
dp[start][end] = dp[start+1][end-1] + 2;
// <----------- different ----------->
//only consider when `start` and `end` in different string.
if (start < word1.size() && end >= word1.size()){
result = max(result, dp[start][end]);
}
// <----------- different ----------->
}else{
dp[start][end] = max (dp[start+1][end], dp[start][end-1]);
}
}
}
return result;
}
};