forked from haoel/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
New Problem Solution -"Maximize Palindrome Length From Subsequences"
- Loading branch information
Showing
2 changed files
with
105 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
104 changes: 104 additions & 0 deletions
104
...cpp/maximizePalindromeLengthFromSubsequences/MaximizePalindromeLengthFromSubsequences.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,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; | ||
} | ||
}; |