C++ N长度的字符串中包含S作为子序列的数量

C++ N长度的字符串中包含S作为子序列的数量

给定一个长度为S的字符串,再给定一个数字n,表示可能包含S作为子序列的字符串的长度。我们需要找到长度为N的唯一字符串的数量,其中包含S作为子序列,其中子序列是从给定字符串中取出的字符集合,可以是所有字符也可以不是,并且它们不需要连续。

示例

输入1

string str = "xyz"
int n = 3

输出

1

解释

只有一个长度为3的字符串包含给定的字符串作为其子序列。

输入2

string str = "aback"
int n = 4

输出

0

解释

长度为4的字符串无法存储大小为5的子序列,或者给定字符串的长度超过了给定的字符串,因此没有解决方案。

输入3

string str = "aba"
int n = 5

结果

6376

方法

我们已经看到了上面的例子以了解这个问题。在这种方法中,我们将使用排列和组合的概念。

我们将创建一个函数,该函数将以当前字符串和给定的数N作为输入,并返回表示所需字符串数量的整数。

在函数中,我们将创建一个数组,该数组将存储从数字0到数字N的阶乘结果。

我们将使用for循环遍历给定字符串的长度和给定的数N之间的范围。

要获取组合数nCr的值,我们需要定义另一个函数,该函数将以n、r和阶乘作为输入,并返回所需的值。

我们将定义另一个函数getPower,该函数将返回给定数字对给定值的幂,但是要注意它将返回带有模运算的值。

我们将调用nCr函数,然后从那里调用power函数并获取代码中可以看到的所需方法。

示例

#include <bits/stdc++.h>
using namespace std;

int mod = 1e9 + 7; // mod value to take mod with 
// function to get the power as the function of mod
long long getPower(long long num1, long long num2){
   long long ans = 1;
   num1 = num1 % mod;
   if(num1 == 0){
      return 0;
   }
   while(num2 > 0){
      if(num2 & 1){
         ans = (ans * num1) % mod;
      }
      num2 /= 2;
      num1 = (num1 * num1) % mod;
   }
   return ans;
}
// get the value of the nCr
long long nCr(int n, int r, long long fact[]){
   // base case 
   if(r > n){
      return 0;
   }
   long long res = fact[n];
   res *= getPower(fact[r], mod - 2);
   res = res % mod; 
   res *= getPower(fact[n - r], mod - 2);
   res = res % mod;
   return res;
}
// function to get the required number of 
int numberOfStrings(string str, int n){
   int len = str.length(); // get the lenght of the given string 
   // if the n is less than than given stirng size
   // then there will be no string present of given length
   if(len > n){
      return 0;
   }
   // array to store the value of the factorials 
   long long fact[n + 1];
   fact[0] = 1; // initializing 0th index value 
   // calculating the result for the other indexes  
   for(int i = 1; i <= n; i++){
      fact[i] = fact[i - 1] * i;
      fact[i] %= mod;
   }
   // variable to store the result 
   long long res = 0;
   // iterating over the all the possible positions
   for (int i = len; i <= n; i++){
      long long temp = nCr(i-1, len-1, fact);
      temp *= getPower(26, n - i);
      temp %= mod;
      temp *= getPower(25, i - len);
      temp %= mod;
      res += temp;
      res %= mod;
   }
   return res;
}
int main(){
   int n = 5;
   string str = "aba";
   cout << "The number of strings of n length having str as a Subsequence are: "<< numberOfStrings(str, n)<<endl;
   return 0;
}

输出

The number of strings of n length having str as a Subsequence are: 6376

时间和空间复杂度

以上代码的时间复杂度是O(N*log(N)),其中N是给定的字符序列的限制。

以上代码的空间复杂度为O(N),因为我们使用一个数组来存储长度为N的阶乘。

结论

在本教程中,我们实现了一个程序,用于计算包含给定字符串S作为子序列的给定长度N的字符串数量,并且字符串数量可能很大,因此我们需要对1e9 + 7取模。我们使用了阶乘和组合方法,以及与模运算相关的幂运算的方法。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程