Skip to content
Related Articles

Related Articles

Save Article
Improve Article
Save Article
Like Article

Maximum String Partition

  • Difficulty Level : Medium
  • Last Updated : 25 May, 2021

Given a string. The task is to find the maximum number P, such that a given string can be partitioned into P contiguous substrings such that any two adjacent substrings must be different. More formally, S = S_{1}S_{2}....S_{P} and S_{i} \ne S_{i + 1}(0 \leq i \leq P - 1).

Examples:  

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

Input: str = “aabccd” 
Output:
Explanation: 
We can divide the given string into four strings, like “a”, “ab”, “c”, “cd”. We can not divide 
it are more than four parts. If we do, then the condition S_{i} \ne S_{i + 1}(0 \leq i \leq P - 1) will not 
satisfy



Input: str = “aaaa” 
Output:

Approach:  

  • Here we only have to focus on the value of P, not upon finding those P substrings.
  • We will solve it greedily. We always check the current string that we have with the previous string that has been taken already.
  • If we find that both of them are the same, then we will go forward, otherwise, create a partition here, and change the previous track of the string to the current string, which means we will treat this current string as the previous string for future comparison.

Below is the implementation of the above approach:  

C++




// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Return the count of string
int maxPartition(string s)
{
    // P will store the answer
    int n = s.length(), P = 0;
 
    // Current will store current string
    // Previous will store the previous
    // string that has been taken already
    string current = "", previous = "";
 
    for (int i = 0; i < n; i++) {
 
        // Add a character to current string
        current += s[i];
 
        if (current != previous) {
 
            // Here we will create a partition and
            // update the previous string with
            // current string
            previous = current;
 
            // Now we will clear the current string
            current.clear();
 
            // Increment the count of partition.
            P++;
        }
    }
 
    return P;
}
 
// Driver code
int main()
{
 
    string s = "geeksforgeeks";
 
    int ans = maxPartition(s);
 
    cout << ans << "\n";
 
    return 0;
}

Java




// Java implementation of the above approach
class GFG
{
// Return the count of string
static int maxPartition(String s)
{
    // P will store the answer
    int n = s.length(), P = 0;
 
    // Current will store current string
    // Previous will store the previous
    // string that has been taken already
    String current = "", previous = "";
 
    for (int i = 0; i < n; i++)
    {
 
        // Add a character to current string
        current += s.charAt(i);
 
        if (!current.equals(previous))
        {
 
            // Here we will create a partition and
            // update the previous string with
            // current string
            previous = current;
 
            // Now we will clear the current string
            current = "";
 
            // Increment the count of partition.
            P++;
        }
    }
    return P;
}
 
// Driver code
public static void main (String[] args)
{
    String s = "geeksforgeeks";
 
    int ans = maxPartition(s);
 
    System.out.println(ans);
}
}
 
// This code is contributed by ihritik

Python3




# Python3 implementation of the above approach
 
# Return the count of string
def maxPartition(s):
     
    # P will store the answer
    n = len(s)
    P = 0
 
    # Current will store current string
    # Previous will store the previous
    # that has been taken already
    current = ""
    previous = ""
 
    for i in range(n):
 
        # Add a character to current string
        current += s[i]
 
        if (current != previous):
 
            # Here we will create a partition and
            # update the previous with
            # current string
            previous = current
 
            # Now we will clear the current string
            current = ""
 
            # Increment the count of partition.
            P += 1
 
    return P
 
# Driver code
s = "geeksforgeeks"
 
ans = maxPartition(s)
 
print(ans)
 
# This code is contributed by Mohit Kumar

C#




// C# implementation of the above approach
using System;
class GFG
{
// Return the count of string
static int maxPartition(string s)
{
    // P will store the answer
    int n = s.Length, P = 0;
 
    // Current will store current string
    // Previous will store the previous
    // string that has been taken already
    string current = "", previous = "";
 
    for (int i = 0; i < n; i++)
    {
 
        // Add a character to current string
        current += s[i];
 
        if (!current.Equals(previous))
        {
 
            // Here we will create a partition and
            // update the previous string with
            // current string
            previous = current;
 
            // Now we will clear the current string
            current = "";
 
            // Increment the count of partition.
            P++;
        }
    }
    return P;
}
 
// Driver code
public static void Main ()
{
    string s = "geeksforgeeks";
 
    int ans = maxPartition(s);
 
    Console.WriteLine(ans);
}
}
 
// This code is contributed by ihritik

Javascript




<script>
 
// Javascript implementation of the above approach
 
// Return the count of string
function maxPartition(s)
{
    // P will store the answer
    var n = s.length, P = 0;
 
    // Current will store current string
    // Previous will store the previous
    // string that has been taken already
    var current = "", previous = "";
 
    for (var i = 0; i < n; i++) {
 
        // Add a character to current string
        current += s[i];
 
        if (current != previous) {
 
            // Here we will create a partition and
            // update the previous string with
            // current string
            previous = current;
 
            // Now we will clear the current string
            current = "";
 
            // Increment the count of partition.
            P++;
        }
    }
 
    return P;
}
 
// Driver code
var s = "geeksforgeeks";
var ans = maxPartition(s);
document.write( ans);
 
</script>
Output: 
11

 

Time Complexity: O(N), where N is the length of the string.
 




My Personal Notes arrow_drop_up
Recommended Articles
Page :