Leetcode journey - Question 1328 - Break a Palindrome

Step by step explanation and approach of the problem with C++ code

ยท

3 min read

Leetcode journey - Question 1328 - Break a Palindrome

Problem:

Q1328. Break a Palindrome

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:

  1. If the length of the string is 1, then we cannot break the palindrome.
  2. We can process only the first half of the string to break the palindrome.
  3. The most lexographically smaller string is "a" and the most lexographically larger string is "z".
  4. So, we can replace the first non-'a' character with 'a' to get the smallest string(lexographically) that is not a palindrome.
  5. 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.

Thank you for reading!

ย