Leetcode journey - Question 1328 - Break a Palindrome
Step by step explanation and approach of the problem with C++ code
Problem:
Given a palindromic string of lowercase English letters palindrome
, replace exactly one character with any lowercase English letter so that the resulting string is not a palindrome and that it is the lexicographically smallest one possible.
Return the resulting string. If there is no way to replace a character to make it not a palindrome, return an empty string.
A string a
is lexicographically smaller than a string b
(of the same length) if in the first position where a
and b
differ, a
has a character strictly smaller than the corresponding character in b
. For example, "abcc"
is lexicographically smaller than "abcd"
because the first position they differ is at the fourth character, and 'c'
is smaller than 'd'
.
Example 1:
Input: palindrome = "abccba" Output: "aaccba" Explanation: There are many ways to make "abccba" not a palindrome, such as "zbccba", "aaccba", and "abacba". Of all the ways, "aaccba" is the lexicographically smallest.
Example 2:
Input: palindrome = "a" Output: "" Explanation: There is no way to replace a single character to make "a" not a palindrome, so return an empty string.
Constraints:
1 <= palindrome.length <= 1000
palindrome
consists of only lowercase English letters.
Solution:
Approach:
We can make the following inference from the problem statement:
- If the length of the string is 1, then we cannot break the palindrome.
- We can process only the first half of the string to break the palindrome.
- The most lexographically smaller string is "a" and the most lexographically larger string is "z".
- So, we can replace the first non-'a' character with 'a' to get the smallest string(lexographically) that is not a palindrome.
- If all the characters are 'a', then we can replace the last character with 'b' to get the smallest string(lexographically) that is not a palindrome.
Psuedocode:
function breakPalindrome(palindrome): n = length of palindrome if n == 1: return "" for i = 0 to n/2: if palindrome[i] != 'a': palindrome[i] = 'a' return palindrome palindrome[n-1] = 'b' return palindrome
Now, we can write the code:
Code:
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string breakPalindrome(string palindrome) {
int n = palindrome.size();
if(n == 1) return "";
for(int i = 0; i < n/2; i++){
if(palindrome[i] != 'a'){
palindrome[i] = 'a';
return palindrome;
}
}
palindrome[n-1] = 'b';
return palindrome;
}
};
int main(){
Solution s;
cout << s.breakPalindrome("abccba") << endl;
return 0;
}
Complexity Analysis:
Time Complexity: O(n)
Space Complexity: O(1)
Hope this helps!
If you have any questions, please leave a comment below. ๐ญ
If you like this article, please share it with your friends. ๐
If you want to read more articles like this, please follow me.