Minimum Length of String After Deleting Similar Ends

Updated on 18 June, 2025
Minimum Length of String After Deleting Similar Ends header image

Problem Statement

Given a string s that consists solely of the characters 'a', 'b', and 'c', you are challenged to iteratively apply a specific algorithm to reduce the string's length as much as possible. The algorithm involves identifying and removing corresponding non-overlapping prefixes and suffixes that contain the same character. The operations performed can be repeated multiple times, or not at all, depending on the structure of the string. The goal is to determine the shortest possible length of the string s after exhaustively applying the described reductions.

Examples

Example 1

Input:

s = "ca"

Output:

2

Explanation:

You can't remove any characters, so the string stays as is.

Example 2

Input:

s = "cabaabac"

Output:

0

Explanation:

An optimal sequence of operations is:
- Take prefix = "c" and suffix = "c" and remove them, s = "abaaba".
- Take prefix = "a" and suffix = "a" and remove them, s = "baab".
- Take prefix = "b" and suffix = "b" and remove them, s = "aa".
- Take prefix = "a" and suffix = "a" and remove them, s = "".

Example 3

Input:

s = "aabccabba"

Output:

3

Explanation:

An optimal sequence of operations is:
- Take prefix = "aa" and suffix = "a" and remove them, s = "bccabb".
- Take prefix = "b" and suffix = "bb" and remove them, s = "cca".

Constraints

  • 1 <= s.length <= 105
  • s only consists of characters 'a', 'b', and 'c'.

Approach and Intuition

To approach the problem of minimizing the length of the string s after potentially multiple operations, we can outline a strategy based on the given examples and constraints:

  1. Observing Continuous Segments:

    • The operation only allows for the removal of segments where both the prefix and suffix contain identical characters. This necessitates observing the string in terms of contiguous blocks of identical characters.
  2. Identifying Eligible Prefixes and Suffixes:

    • We systematically identify block-like structures in 's' that start and end with the same character and have potential for internal reduction (i.e., internal characters that match the block's starting and ending character but are separated by different characters).
  3. Iterative Reduction:

    • Each allowed operation shaves off matching prefixes and suffixes. We iterate this process, each time updating our view of the string and its block-like formations, until no further prefix-suffix matches across differing indices can be made.
  4. Edge Cases:

    • Strings with no repeat characters or those with non-matching blocks from start to end won't be reducible.

This approach relies heavily on the ability to dynamically update and "shrink" our view of the string as operations are performed, which can often be conceptualized using stack-based or two-pointer techniques that aid in tracking and collapsing relevant segments efficiently. The goal is to ensure all possible reductions are made to achieve the minimum string length.

Solutions

  • C++
  • Java
  • Python
cpp
class Solution {
public:
    int findMinimumLength(string text) {
        return stripSimilarChars(text, 0, text.size() - 1);
    }
private:
    int stripSimilarChars(string &text, int start, int finish) {
        if (start >= finish || text[start] != text[finish])
            return finish - start + 1;

        char currentChar = text[start];
        
        while (start <= finish && text[start] == currentChar)
            start++;

        while (finish > start && text[finish] == currentChar)
            finish--;

        return stripSimilarChars(text, start, finish);
    }
};

The given C++ code is a solution for reducing a string to its minimum length by recursively stripping ends of the string that contain similar characters. The function findMinimumLength serves as an entry point, and it utilizes a helper function stripSimilarChars to perform the main logic.

  • The findMinimumLength function takes a string as input and calls stripSimilarChars with the initial indices of the string's start and finish.

  • The stripSimilarChars function:

    1. Performs a check to see if the starting index is not less than the ending index or the characters at these indices are different. If either condition is true, it calculates the length of the current substring by subtracting the start index from the finish index and adding one to ensure the count includes both endpoints.

    2. Identifies the character at the start index and begins two while loops. The first loop increments the start index as long as the characters at the start index match the initial character. The second loop decrements the finish index under the same condition of matching characters.

    3. Once no more matching characters are found at both the start and end, it recursively calls itself with the new start and finish indices, continuing the process of stripping until no further reductions based on similar character ends can be made.

Return to findMinimumLength, thereby providing the length of the string that cannot be further reduced by this method.

java
public class Solution {
    public int minimumSize(String str) {
        return reduceRepeatingCharacters(str, 0, str.length() - 1);
    }

    private int reduceRepeatingCharacters(String str, int start, int stop) {
        if (start >= stop || str.charAt(start) != str.charAt(stop)) {
            return stop - start + 1;
        } else {
            char c = str.charAt(start);

            while (start <= stop && str.charAt(start) == c) {
                start++;
            }

            while (stop > start && str.charAt(stop) == c) {
                stop--;
            }

            return reduceRepeatingCharacters(str, start, stop);
        }
    }
}

The task here focuses on finding the minimum length of a string after removing identical characters from both ends. The solution utilizes a recursive approach to strip matched characters from the ends of the string and continues until no further matching characters are present.

  • Start by defining a function minimumSize which initiates the recursive function reduceRepeatingCharacters with starting and ending indices of the string.

  • Within reduceRepeatingCharacters, check if the characters at the start and stop indices are the same. If they are different, or if the start index surpasses the stop index, you immediately return the difference, adjusted by 1 to account for zero indexing.

  • If the characters match, increment the start index and decrement the stop index to skip past these matched characters. Continue the recursive call with the new indices.

  • The recursion terminates once no matched characters are found or the indices cross each other, and the number of unmatched characters between start and stop is returned.

Adopt this approach to ensure that all possible matching characters at both ends of the string are removed optimally, calculating the shortest possible remaining string length.

python
class Solution:
    def getMinimumLength(self, string: str) -> int:
        return self.removeMatchingEnds(string, 0, len(string) - 1)

    def removeMatchingEnds(self, string: str, left: int, right: int) -> int:
        if left >= right or string[left] != string[right]:
            return right - left + 1
        else:
            charAtEnds = string[left]
            
            while left <= right and string[left] == charAtEnds:
                left += 1

            while right > left and string[right] == charAtEnds:
                right -= 1

            return self.removeMatchingEnds(string, left, right)

This Python3 solution is designed to return the minimum length of a string after deleting similar characters from both ends. The method computes this by recursively trimming characters that are the same at the beginning and end of the string until no more matching pairs are found or the string cannot be reduced further.

To understand the approach:

  • Initiate the process by calling getMinimumLength with the entire string.
  • Use the helper function removeMatchingEnds, which takes the string along with start (left) and end (right) indices.
  • Check if characters at positions left and right match. If not, the minimum length is right - left + 1.
  • If they do match, increment the left index and decrement the right index as far as the characters continue to match (charAtEnds).
  • Recursively call removeMatchingEnds for the new sub-string defined by the updated left and right positions until no matching ends are left.

The algorithm effectively peels layers of matching ends from the string, reducing its length until the base case (no matching ends) is achieved.

Comments

No comments yet.