📌  相关文章
📜  包含 0、1 和 2 的最小窗口

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

包含 0、1 和 2 的最小窗口

给定一个大小为N的由字符0、1 和 2 组成的字符串S ,任务是找到包含所有三个字符0、1 和 2 的字符串S的最小子串的长度。如果不存在这样的子串,则返回-1。

例子:

方法:该方法的思想如下所述:

请按照下图更好地理解。

插图:

请按照以下步骤解决问题:

  • 取三个变量zeroonetwo来检查窗口中是否找到了 0、1 和 2。
  • 取三个变量zeroindexoneindextwoindex ,当我们遇到它们时,它们将存储 0、1 和 2 的索引。
  • 对 String 的整个长度运行 for 循环:
    • 更新遇到的值的索引。
    • 如果找到其中三个,则更新窗口的长度。
    • 长度将是索引 0、1 和 2 的最大值和最小值之间的差。
  • 如果遍历结束后没有找到所有三个值,即 0、1、2,则在这种情况下返回“-1”。

下面是上述方法的实现:

C++
// C++ program for above approach
 
#include 
using namespace std;
 
// Function to find the length of
// the smallest substring
int smallestSubstring(string S)
{
    int res = INT_MAX;
 
    // To check 0, 1 and 2
    bool zero = false, one = false, two = false;
 
    // To store indexes of 0, 1 and 2
    int zeroindex, oneindex, twoindex, j = 0;
    for (int i = 0; i < S.length(); i++) {
        if (S[i] == '0') {
            zero = true;
            zeroindex = j;
        }
        else if (S[i] == '1') {
            one = true;
            oneindex = j;
        }
        else if (S[i] == '2') {
            two = true;
            twoindex = j;
        }
 
        // Calculating length
        if (zero and one and two)
            res = min(res,
                      max({ zeroindex,
                            oneindex,
                            twoindex })
                          - min({ zeroindex,
                                  oneindex,
                                  twoindex }));
        j++;
    }
 
    // Egde case
    if (res == INT_MAX)
        return -1;
    return res + 1;
}
 
// Driver Code
int main()
{
    string S = "01212";
 
    // Function call
    cout << smallestSubstring(S);
    return 0;
}


Javascript


输出
3

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