2023-04-22 Daily Challenge
Today I have done leetcode's April LeetCoding Challenge with cpp
.
April LeetCoding Challenge 22
Description
Minimum Insertion Steps to Make a String Palindrome
Given a string s
. In one step you can insert any character at any index of the string.
Return the minimum number of steps to make s
palindrome.
A Palindrome String is one that reads the same backward as well as forward.
Example 1:
Input: s = "zzazz" Output: 0 Explanation: The string "zzazz" is already palindrome we do not need any insertions.
Example 2:
Input: s = "mbadm" Output: 2 Explanation: String can be "mbdadbm" or "mdbabdm".
Example 3:
Input: s = "leetcode" Output: 5 Explanation: Inserting 5 characters the string becomes "leetcodocteel".
Constraints:
1 <= s.length <= 500
s
consists of lowercase English letters.
Solution
auto speedup = []() {
std::ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
return nullptr;
}();
class Solution {
int LCS(string &s1, string &s2) {
int len1 = s1.length();
int len2 = s2.length();
// cout << "$$$$$$";
vector<vector<int>> dp(2, vector<int>(len2 + 1));
for(int i = 0; i < len1; ++i) {
for(int j = 1; j <= len2; ++j) {
int parity = i & 1;
dp[parity][j] = max(dp[!parity][j], dp[parity][j - 1]);
if(s2[j - 1] == s1[i]) {
dp[parity][j] = max(dp[parity][j], dp[!parity][j - 1] + 1);
}
}
}
return dp[!(len1 & 1)][len2];
}
bool isPalindrome(string &s) {
int len = s.length();
for(int i = 0; i * 2 < len; ++i) {
if(s[i] != s[len - 1 - i]) return false;
}
return true;
}
public:
int minInsertions(string s) {
if(isPalindrome(s)) return 0;
string r = s;
reverse(r.begin(), r.end());
return s.length() - LCS(s, r);
}
};
// Accepted
// 58/58 cases passed (71 ms)
// Your runtime beats 57.64 % of cpp submissions
// Your memory usage beats 89.32 % of cpp submissions (6.8 MB)