检查二进制字符串是否包含 A 对 0 和 B 个独立的 0

data structurec++programming

检查二进制字符串是否包含 A 对 0 和 B 个独立的 0 是计算机科学中经常遇到的问题,特别是在算法和数据结构领域。问题陈述非常简单,在密码学、网络安全和机器学习等各个领域都发挥着重要作用。

在本教程中,我们将讨论使用 C++ 解决此问题的方法。我们将首先概述该方法,首先通过一些示例定义问题陈述,然后深入研究实现细节。那么让我们开始吧!

问题陈述

给定一个长度为 n 的二进制字符串,由 0 和 1 组成,我们需要确定它是否包含 A 对相邻的 0(00)和 B 个独立的 0(不与另一个 0 相邻的 0)。

示例

示例 1

Input:
s = "100101000"
A = 2
B = 1
Output:
Yes

解释:在输入字符串中,有两对相邻的 0:"10|010|1000"。此外,还有一个独立的 0:"100|1|01000"。因此,输出为"Yes",因为输入字符串包含两对相邻的 0 和一个独立的 0。

示例 2

Input:
s = "110010010"
A = 3
B = 2
Output:
No

解释: 输入字符串中有三对相邻的0:"1|100|100|10"。但只有两个独立的0:"1100|1|0010"。因此,输出为"否",因为输入字符串不包含两个独立的 0。

算法

  • 将对和单计数器初始化为零。

  • 使用索引 i 从 0 到 n-2 的循环遍历输入字符串 s。

  • 检查当前字符和下一个字符是否都是"0"。

    • 如果是,则将对增加 1,并通过将 i 增加 1 来跳过下一个字符。

  • 否则,检查当前字符是否为"0"且下一个字符是否为"1"。

    • 如果是,则将单计数器增加1.

  • 检查 s 的最后一个字符是否为"0"。

    • 如果是,则将 singles 增加 1。

  • 如果对的数量大于或等于 A 并且 singles 的数量大于或等于 B,则返回 true,否则返回 false。

示例

使用 C++ 实现上述算法

在此实现中,我们定义了一个名为"contains_zeros"的函数,该函数接受一个二进制字符串"s"和两个整数"A"和"B"。如果字符串包含至少"A"对相邻零和"B"个独立零,则该函数返回"true";否则,返回"false"。

为了确定字符串中对和独立零的数量,我们遍历字符串并跟踪遇到的对和独立零的数量。如果我们发现一对相邻的零,我们将跳过下一个字符。在循环结束时,我们检查最后一个字符是否为零,并相应地增加独立零的数量。

最后,在"main"函数中,我们使用输入字符串"s"以及"A"和"B"的值调用"contains_zeros"。如果函数返回"true",我们打印"Yes",否则打印"No"。

#include <iostream>
#include <string>
using namespace std;
bool contains_zeros(string s, int A, int B) {
    int n = s.size();
    int pairs = 0;
    int singles = 0;
    for (int i = 0; i < n - 1; i++) {
        if (s[i] == '0' && s[i+1] == '0') {
            pairs++;
            i++; // Skip the next character
        } else if (s[i] == '0' && s[i+1] == '1') {
            singles++;
        }
    }
    if (s[n-1] == '0') {
        singles++;
    }
    return pairs >= A && singles >= B;
}
int main() {
    string s = "100101000";
    int A = 2;
    int B = 1;
    bool result = contains_zeros(s, A, B);
    cout << "Input:" << endl;
    cout << "s = \"" << s << "\"" << endl;
    cout << "A = " << A << endl;
    cout << "B = " << B << endl;
    cout << endl;
    cout << "Output:" << endl;
    if (result) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }
    return 0;
}

输出

执行上述 C++ 程序将产生以下输出:

Input:
s = "100101000"
A = 2
B = 1

Output:
Yes

结论

总之,我们讨论了如何使用 C++ 程序检查二进制字符串是否包含给定数量的 0 对和独立 0。我们提供了一种算法并实现了一个函数,该函数以字符串"s"和两个整数"A"和"B"作为输入,并返回一个布尔值,指示"s"是否至少包含"A"对 0 和"B"个独立 0。

该算法的时间复杂度为 O(n),其中 n 是输入字符串"s"的长度,因为我们需要遍历"s"一次以计算对和单个的数量。


相关文章