📌  相关文章
📜  最大字符串分区

📅  最后修改于: 2021-04-23 07:06:21             🧑  作者: Mango

给定一个字符串。任务是找到最大数目P ,以便可以将给定的字符串划分为P个连续的子字符串,以使任何两个相邻的子字符串必须不同。更正式S = S_{1}S_{2}....S_{P}S_{i} \ne S_{i + 1}(0 \leq i \leq P - 1)

例子:

方法:

  • 在这里,我们只需要关注P的值,而不是查找那些P子串。
  • 我们将贪婪地解决它,我们总是将我们拥有的当前字符串与已经获取的先前字符串检查。
  • 如果发现它们都相同,则将继续进行操作,否则在此处创建一个分区,并将字符串的前一个音轨更改为当前字符串,这意味着我们会将当前字符串视为前一个字符串,以便将来进行比较。

下面是上述方法的实现:

C++
// C++ implementation of the above approach
#include 
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


输出:
11

时间复杂度: O(N),其中N是字符串的长度。