📌  相关文章
📜  执行给定操作后不同可能字符串的计数

📅  最后修改于: 2021-09-17 07:31:14             🧑  作者: Mango

给定一个数字字符串S最初只包含三种类型的字符0、12,然后执行以下两个操作:

  • 出现两个连续的 1 可以用 3 代替。
  • 出现两个连续的 2 可以用 4 代替。

给定的任务是找到使用这些操作可以形成的不同字符串的总数。
例子:

方法:
为了解决这个问题,我们使用了动态规划方法。我们定义了一个数组dp来存储长度等于其各自索引的可能字符串的数量。

  • 初始化 dp[0] = dp[1] = 1。
  • 对于[1, N-1]之间的任何索引 i,如果该索引处的字符是 ‘1’ 或 ‘2’ 并且等于其前一个索引的字符,则添加长度为i-1的可能字符串和i-2 。否则,它与长度i-1 相同
  • 返回dp[n]作为可能的不同字符串的计数。

下面是上述方法的实现:

C++
// C++ implementation of
// the above approach
#include
using namespace std;
 
// Function that prints the
// number of different strings
// that can be formed
void differentStrings(string s)
{
    // Computing the length of
    // the given string
    int n = s.length();
 
    vector dp(n + 1);
 
    // Base case
    dp[0] = dp[1] = 1;
 
    // Traverse the given string
    for (int i = 1; i < n; i++) {
 
        // If two consecutive 1's
        // or 2's are present
        if (s[i] == s[i - 1]
            && (s[i] == '1'
                || s[i] == '2'))
 
            dp[i + 1]
                = dp[i] + dp[i - 1];
 
        // Otherwise take
        // the previous value
        else
            dp[i + 1] = dp[i];
    }
 
    cout << dp[n] << "\n";
}
 
// Driver Code
int main()
{
    string S = "0111022110";
 
    differentStrings(S);
 
    return 0;
}


Java
// Java implementation of the above approach
import java.io.*;
 
class GFG{
 
// Function that prints the
// number of different strings
// that can be formed
static void differentStrings(String s)
{
     
    // Computing the length of
    // the given string
    int n = s.length();
 
    int[] dp = new int[n + 1];
 
    // Base case
    dp[0] = dp[1] = 1;
 
    // Traverse the given string
    for(int i = 1; i < n; i++)
    {
        
       // If two consecutive 1's
       // or 2's are present
       if (s.charAt(i) == s.charAt(i - 1) &&
          (s.charAt(i) == '1' ||
           s.charAt(i) == '2'))
           dp[i + 1] = dp[i] + dp[i - 1];
            
       // Otherwise take the
       // previous value
       else
           dp[i + 1] = dp[i];
    }
    System.out.println(dp[n]);
}
 
// Driver code
public static void main(String[] args)
{
    String S = "0111022110";
 
    differentStrings(S);
}
}
 
// This code is contributed by offbeat


Python3
# Python3 implementation of
# the above approach
 
# Function that prints the
# number of different strings
# that can be formed
def differentStrings(s):
 
    # Computing the length of
    # the given string
    n = len(s)
 
    dp = [0] * (n + 1)
 
    # Base case
    dp[0] = dp[1] = 1
 
    # Traverse the given string
    for i in range (1, n):
 
        # If two consecutive 1's
        # or 2's are present
        if (s[i] == s[i - 1] and
           (s[i] == '1' or
            s[i] == '2')):
 
            dp[i + 1] = dp[i] + dp[i - 1]
 
        # Otherwise take
        # the previous value
        else:
            dp[i + 1] = dp[i]
    
    print (dp[n])
 
# Driver Code
if __name__ == "__main__": 
    S = "0111022110"
    differentStrings(S)
     
# This code is contributed by Chitranayal


C#
// C# implementation of the above approach
using System;
class GFG{
 
// Function that prints the
// number of different strings
// that can be formed
static void differentStrings(string s)
{
     
    // Computing the length of
    // the given string
    int n = s.Length;
 
    int[] dp = new int[n + 1];
 
    // Base case
    dp[0] = dp[1] = 1;
 
    // Traverse the given string
    for(int i = 1; i < n; i++)
    {
 
       // If two consecutive 1's
       // or 2's are present
       if (s[i] == s[i - 1] &&
          (s[i] == '1' ||
           s[i] == '2'))
           dp[i + 1] = dp[i] + dp[i - 1];
        
       // Otherwise take the
       // previous value
       else
           dp[i + 1] = dp[i];
    }
    Console.Write(dp[n]);
}
 
// Driver code
public static void Main()
{
    string S = "0111022110";
 
    differentStrings(S);
}
}
 
// This code is contributed by Code_Mech


Javascript


输出:
12

时间复杂度: O(N)