给定一个数字字符串S最初只包含三种类型的字符0、1和2,然后执行以下两个操作:
- 出现两个连续的 1 可以用 3 代替。
- 出现两个连续的 2 可以用 4 代替。
给定的任务是找到使用这些操作可以形成的不同字符串的总数。
例子:
Input: S = “0110000022”
Output: 4
Explanation:
There can be four different formed by using the operations, the four strings are
“0110000022”, “030000022”, “03000004”, “011000004”
Input: S = “111”
Output: 3
方法:
为了解决这个问题,我们使用了动态规划方法。我们定义了一个数组dp来存储长度等于其各自索引的可能字符串的数量。
- 初始化 dp[0] = dp[1] = 1。
- 对于[1, N-1]之间的任何索引 i,如果该索引处的字符是 ‘1’ 或 ‘2’ 并且等于其前一个索引的字符,则添加长度为i-1的可能字符串和i-2 。否则,它与长度i-1 相同。
dp[i + 1] = dp[i] + dp[i-1] if S[i] == S[i-1] where S[i] is either ‘1’ or ‘2’.
dp[i + 1] = dp[i] otherwise.
- 返回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)