计算二进制字符串中替换“?”字符可能产生的排列数


在这个问题中,我们给定一个包含 0、1 和“?”字符的字符串。我们需要通过用 0 和 1 替换“?”来找到字符串的排列。解决问题的逻辑是,我们可以用 0 或 1 替换每个“?”。因此,通过替换一个“?”,我们可以生成两个不同的排列,并且通过用 2 种可能性替换 N 个“?”,我们可以生成 2^N 个排列。

在本教程中,我们将学习两种不同的方法来解决给定的问题。

问题陈述 – 我们给定一个包含“0”、“1”和“?”字符的字符串 str。我们需要用 0 或 1 替换“?”并找到给定字符串的所有排列。

示例

输入 – str = "0101001??01"

输出 – 4

解释 – 4 个不同的组合是 01010010101、01010011001、01010010001 和 01010011101

输入 – str = ’01?0’

输出 – 2

解释 – 2 个不同的组合是 0100 和 0110。

输入 – str = ‘01010’

输出 – 1

解释 – 给定的字符串本身就是一个排列。

方法 1

在这种方法中,我们将通过遍历字符串来计算给定字符串中“?”的总数。之后,我们将使用左移运算符获取 2^N,其中 N 是字符串中“?”的总数。

算法

  • 定义变量“cnt”并初始化为 0,以存储给定字符串中“?”的数量

  • 使用循环遍历字符串。如果当前字符是“?”,则将“cnt”变量的值增加 1。

  • 使用左移运算符获取 2cnt 并将其存储到“perm”变量中。

  • 返回“perm”变量的值

示例

#include <iostream>
using namespace std;

// function to count the number of permutations of the given string by replacing '?' with '0' or '1'
int totalPermutations(string s){
   // variable to store the count of '?' in the string
   int cnt = 0;
   // loop to count the number of '?' in the string
   for (int i = 0; i < s.length(); i++){
      if (s[i] == '?'){
         cnt++;
      }
   }
   // total number of permutations of the string by replacing'?' with '0' or '1' is 2^cnt
   int perm = 0;
   //   calculating 2^cnt with left shift operator
   perm = 1 << cnt;
   return perm;
}
int main(){
   string str = "0101001??01";
   cout << "The total number of permutations of the string we can get by replacing ? with 0 or 1 is " << totalPermutations(str);
   return 0;
}

输出

The total number of permutations of the string we can get by replacing ? with 0 or 1 is 4

时间复杂度 – O(N),因为我们遍历了字符串。

空间复杂度 – O(1),因为我们没有使用动态空间。

方法 2

在这种方法中,我们将使用 count() 方法来计算给定字符串中“?”字符的总数。之后,我们使用 pow() 方法计算 2^N。

算法

  • 定义变量“cnt”并将其初始化为零。

  • 使用 count() 方法计算给定字符串中“?”出现的总数。我们需要将字符串的起始点作为第一个参数,结束点作为第二个参数,以及“?”作为第三个参数传递。

  • 使用 pow() 方法获取 2cnt。

  • 返回“perm”值。

示例

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

// function to count the number of permutations of the given string by replacing '?' with '0' or '1'
int totalPermutations(string s){
   // variable to store the count of '?' in the string
   int cnt = 0;
   //    using the count() function to count the number of '?' in the string
   cnt = count(s.begin(), s.end(), '?');
   int perm = 0;
   //   calculating 2^cnt using the pow() function
   perm = pow(2, cnt);
   return perm;
}
int main(){
   string str = "0101001??01";
   cout << "The total number of permutations of the string we can get by replacing ? with 0 or 1 is " << totalPermutations(str);
   return 0;
}

输出

The total number of permutations of the string we can get by replacing ? with 0 or 1 is 4

时间复杂度 – O(N),因为 count() 方法迭代长度为 N 的字符串。

空间复杂度 – O(1)

我们学习了两种不同的方法来计算通过用 0 或 1 替换“?”字符可以获得的排列总数。程序员可以使用左移运算符的 pow() 方法来计算 2N。

更新于: 2023年8月10日

109 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告