📌  相关文章
📜  给定字符串最多包含 X 个 0 和 Y 个 1 的最长子字符串

📅  最后修改于: 2022-05-13 01:57:07.996000             🧑  作者: Mango

给定字符串最多包含 X 个 0 和 Y 个 1 的最长子字符串

给定一个长度为N的二进制字符串S ,任务是找到最多包含X0Y1 的最长子串。

例子:

朴素方法:解决这个问题的朴素方法是找到所有子字符串,并为每个子字符串计算子字符串中01 的数量,并检查它们的数量是否分别最多为 X 和 Y。

时间复杂度: O(N 2 )
辅助空间: O(1)

Efficient Approach:这个问题可以使用基于以下思想的两个指针方法的概念来解决:  

请按照以下步骤解决此问题。

  • i、jmaxLength初始化为0
  • j < N时遍历。
    • 计算在第 j 个索引处结束的01 的数量。
    • 检查01 的数量是否满足给定条件。
    • 如果是,则计算从i开始到j结束的当前子字符串的大小。
      • 如果计算的大小大于maxLength ,则更新maxLength
    • 否则,减少第 i 个索引处的字符数并增加i的值。
  • 返回maxLength作为最终答案。

下面是上述方法的实现:

C++14
// C++ code to implement the approach
 
#include 
using namespace std;
 
// Function to find the longest substring
// with at most X number of 0's
// and Y number of 1's
int longestKSubarray(string& S, int X, int Y)
{
    int N = S.length(), i = 0, j = 0;
    int count0 = 0, count1 = 0, maxLength = 0;
 
    while (j < N) {
 
        // Increment the count of jth character
        if (S[j] == '0') {
            count0++;
        }
        else {
            count1++;
        }
 
        // Check for Given condition
        if (count0 > X || count1 > Y) {
 
            // Reduce the count of ith charater
            if (S[i] == '0') {
                count0--;
            }
            else {
                count1--;
            }
 
            // Move the ith pointer
            i++;
        }
 
        // Move the jth pointer
        j++;
 
        // Keep Updating the maxLength.
        maxLength = max(maxLength, j - i);
    }
    return maxLength;
}
 
// Driver's code
int main()
{
    string S = "10101";
    int X = 1, Y = 2;
 
    // Function call
    cout << longestKSubarray(S, X, Y);
    return 0;
}


Javascript


输出
3

时间复杂度: 在)
辅助空间: O(1)