给定长度n,计算可以使用“ a”,“ b”和“ c”(最多允许一个“ b”和两个“ c”)构成的长度为n的字符串的数量。
例子 :
Input : n = 3
Output : 19
Below strings follow given constraints:
aaa aab aac aba abc aca acb acc baa
bac bca bcc caa cab cac cba cbc cca ccb
Input : n = 4
Output : 39
在Google访谈中问
一个简单的解决方案是递归地计算字符串的所有可能组合,这些组合的模式可以一直到后面的“ a”,“ b”和“ c”。
以下是上述想法的实现
C++
// C++ program to count number of strings
// of n characters with
#include
using namespace std;
// n is total number of characters.
// bCount and cCount are counts of 'b'
// and 'c' respectively.
int countStr(int n, int bCount, int cCount)
{
// Base cases
if (bCount < 0 || cCount < 0) return 0;
if (n == 0) return 1;
if (bCount == 0 && cCount == 0) return 1;
// Three cases, we choose, a or b or c
// In all three cases n decreases by 1.
int res = countStr(n-1, bCount, cCount);
res += countStr(n-1, bCount-1, cCount);
res += countStr(n-1, bCount, cCount-1);
return res;
}
// Driver code
int main()
{
int n = 3; // Total number of characters
cout << countStr(n, 1, 2);
return 0;
}
Java
// Java program to count number
// of strings of n characters with
import java.io.*;
class GFG
{
// n is total number of characters.
// bCount and cCount are counts of 'b'
// and 'c' respectively.
static int countStr(int n,
int bCount,
int cCount)
{
// Base cases
if (bCount < 0 || cCount < 0) return 0;
if (n == 0) return 1;
if (bCount == 0 && cCount == 0) return 1;
// Three cases, we choose, a or b or c
// In all three cases n decreases by 1.
int res = countStr(n - 1, bCount, cCount);
res += countStr(n - 1, bCount - 1, cCount);
res += countStr(n - 1, bCount, cCount - 1);
return res;
}
// Driver code
public static void main (String[] args)
{
int n = 3; // Total number of characters
System.out.println(countStr(n, 1, 2));
}
}
// This code is contributed by akt_mit
Python 3
# Python 3 program to
# count number of strings
# of n characters with
# n is total number of characters.
# bCount and cCount are counts
# of 'b' and 'c' respectively.
def countStr(n, bCount, cCount):
# Base cases
if (bCount < 0 or cCount < 0):
return 0
if (n == 0) :
return 1
if (bCount == 0 and cCount == 0):
return 1
# Three cases, we choose, a or b or c
# In all three cases n decreases by 1.
res = countStr(n - 1, bCount, cCount)
res += countStr(n - 1, bCount - 1, cCount)
res += countStr(n - 1, bCount, cCount - 1)
return res
# Driver code
if __name__ =="__main__":
n = 3 # Total number of characters
print(countStr(n, 1, 2))
# This code is contributed
# by ChitraNayal
C#
// C# program to count number
// of strings of n characters
// with a, b and c under given
// constraints
using System;
class GFG
{
// n is total number of
// characters. bCount and
// cCount are counts of
// 'b' and 'c' respectively.
static int countStr(int n,
int bCount,
int cCount)
{
// Base cases
if (bCount < 0 || cCount < 0)
return 0;
if (n == 0) return 1;
if (bCount == 0 && cCount == 0)
return 1;
// Three cases, we choose,
// a or b or c. In all three
// cases n decreases by 1.
int res = countStr(n - 1,
bCount, cCount);
res += countStr(n - 1,
bCount - 1, cCount);
res += countStr(n - 1,
bCount, cCount - 1);
return res;
}
// Driver code
static public void Main ()
{
// Total number
// of characters
int n = 3;
Console.WriteLine(countStr(n, 1, 2));
}
}
// This code is contributed by aj_36
PHP
Javascript
C++
// C++ program to count number of strings
// of n characters with
#include
using namespace std;
// n is total number of characters.
// bCount and cCount are counts of 'b'
// and 'c' respectively.
int countStrUtil(int dp[][2][3], int n, int bCount=1,
int cCount=2)
{
// Base cases
if (bCount < 0 || cCount < 0) return 0;
if (n == 0) return 1;
if (bCount == 0 && cCount == 0) return 1;
// if we had saw this combination previously
if (dp[n][bCount][cCount] != -1)
return dp[n][bCount][cCount];
// Three cases, we choose, a or b or c
// In all three cases n decreases by 1.
int res = countStrUtil(dp, n-1, bCount, cCount);
res += countStrUtil(dp, n-1, bCount-1, cCount);
res += countStrUtil(dp, n-1, bCount, cCount-1);
return (dp[n][bCount][cCount] = res);
}
// A wrapper over countStrUtil()
int countStr(int n)
{
int dp[n+1][2][3];
memset(dp, -1, sizeof(dp));
return countStrUtil(dp, n);
}
// Driver code
int main()
{
int n = 3; // Total number of characters
cout << countStr(n);
return 0;
}
Java
// Java program to count number of strings
// of n characters with
class GFG
{
// n is total number of characters.
// bCount and cCount are counts of 'b'
// and 'c' respectively.
static int countStrUtil(int[][][] dp, int n,
int bCount, int cCount)
{
// Base cases
if (bCount < 0 || cCount < 0)
{
return 0;
}
if (n == 0)
{
return 1;
}
if (bCount == 0 && cCount == 0)
{
return 1;
}
// if we had saw this combination previously
if (dp[n][bCount][cCount] != -1)
{
return dp[n][bCount][cCount];
}
// Three cases, we choose, a or b or c
// In all three cases n decreases by 1.
int res = countStrUtil(dp, n - 1, bCount, cCount);
res += countStrUtil(dp, n - 1, bCount - 1, cCount);
res += countStrUtil(dp, n - 1, bCount, cCount - 1);
return (dp[n][bCount][cCount] = res);
}
// A wrapper over countStrUtil()
static int countStr(int n, int bCount, int cCount)
{
int[][][] dp = new int[n + 1][2][3];
for (int i = 0; i < n + 1; i++)
{
for (int j = 0; j < 2; j++)
{
for (int k = 0; k < 3; k++)
{
dp[i][j][k] = -1;
}
}
}
return countStrUtil(dp, n,bCount,cCount);
}
// Driver code
public static void main(String[] args)
{
int n = 3; // Total number of characters
int bCount = 1, cCount = 2;
System.out.println(countStr(n,bCount,cCount));
}
}
// This code has been contributed by 29AjayKumar
Python3
# Python 3 program to count number of strings
# of n characters with
# n is total number of characters.
# bCount and cCount are counts of 'b'
# and 'c' respectively.
def countStrUtil(dp, n, bCount=1,cCount=2):
# Base cases
if (bCount < 0 or cCount < 0):
return 0
if (n == 0):
return 1
if (bCount == 0 and cCount == 0):
return 1
# if we had saw this combination previously
if (dp[n][bCount][cCount] != -1):
return dp[n][bCount][cCount]
# Three cases, we choose, a or b or c
# In all three cases n decreases by 1.
res = countStrUtil(dp, n-1, bCount, cCount)
res += countStrUtil(dp, n-1, bCount-1, cCount)
res += countStrUtil(dp, n-1, bCount, cCount-1)
dp[n][bCount][cCount] = res
return dp[n][bCount][cCount]
# A wrapper over countStrUtil()
def countStr(n):
dp = [ [ [-1 for x in range(n+2)] for y in range(3)]for z in range(4)]
return countStrUtil(dp, n)
# Driver code
if __name__ == "__main__":
n = 3 # Total number of characters
print(countStr(n))
# This code is contributed by chitranayal
C#
// C# program to count number of strings
// of n characters with
using System;
class GFG
{
// n is total number of characters.
// bCount and cCount are counts of 'b'
// and 'c' respectively.
static int countStrUtil(int[,,] dp, int n,
int bCount=1, int cCount=2)
{
// Base cases
if (bCount < 0 || cCount < 0)
return 0;
if (n == 0)
return 1;
if (bCount == 0 && cCount == 0)
return 1;
// if we had saw this combination previously
if (dp[n,bCount,cCount] != -1)
return dp[n,bCount,cCount];
// Three cases, we choose, a or b or c
// In all three cases n decreases by 1.
int res = countStrUtil(dp, n - 1, bCount, cCount);
res += countStrUtil(dp, n - 1, bCount - 1, cCount);
res += countStrUtil(dp, n - 1, bCount, cCount - 1);
return (dp[n, bCount, cCount] = res);
}
// A wrapper over countStrUtil()
static int countStr(int n)
{
int[,,] dp = new int[n + 1, 2, 3];
for(int i = 0; i < n + 1; i++)
for(int j = 0; j < 2; j++)
for(int k = 0; k < 3; k++)
dp[i, j, k] = -1;
return countStrUtil(dp, n);
}
// Driver code
static void Main()
{
int n = 3; // Total number of characters
Console.Write(countStr(n));
}
}
// This code is contributed by DrRoot_
Javascript
C++
// A O(1) CPP program to find number of strings
// that can be made under given constraints.
#include
using namespace std;
int countStr(int n)
{
return 1+(n*2)+(n*((n*n)-1)/2);
}
// Driver code
int main()
{
int n = 3;
cout << countStr(n);
return 0;
}
Java
// A O(1) Java program to
// find number of strings
// that can be made under
// given constraints.
import java.io.*;
class GFG
{
static int countStr(int n)
{
return 1 + (n * 2) +
(n * ((n * n) - 1) / 2);
}
// Driver code
public static void main (String[] args)
{
int n = 3;
System.out.println( countStr(n));
}
}
// This code is contributed by ajit
Python 3
# A O(1) Python3 program to find
# number of strings that can be
# made under given constraints.
def countStr(n):
return (1 + (n * 2) +
(n * ((n * n) - 1) // 2))
# Driver code
if __name__ == "__main__":
n = 3
print(countStr(n))
# This code is contributed
# by ChitraNayal
C#
// A O(1) C# program to
// find number of strings
// that can be made under
// given constraints.
using System;
class GFG
{
static int countStr(int n)
{
return 1 + (n * 2) +
(n * ((n * n) - 1) / 2);
}
// Driver code
static public void Main ()
{
int n = 3;
Console.WriteLine(countStr(n));
}
}
// This code is contributed by m_kit
PHP
Javascript
输出 :
19
上述解决方案的时间复杂度是指数的。高效的解决方案
如果淹没上面代码的递归树,我们可以注意到相同的值出现了多次。因此,我们存储结果,以后重复使用将在以后使用。
C++
// C++ program to count number of strings
// of n characters with
#include
using namespace std;
// n is total number of characters.
// bCount and cCount are counts of 'b'
// and 'c' respectively.
int countStrUtil(int dp[][2][3], int n, int bCount=1,
int cCount=2)
{
// Base cases
if (bCount < 0 || cCount < 0) return 0;
if (n == 0) return 1;
if (bCount == 0 && cCount == 0) return 1;
// if we had saw this combination previously
if (dp[n][bCount][cCount] != -1)
return dp[n][bCount][cCount];
// Three cases, we choose, a or b or c
// In all three cases n decreases by 1.
int res = countStrUtil(dp, n-1, bCount, cCount);
res += countStrUtil(dp, n-1, bCount-1, cCount);
res += countStrUtil(dp, n-1, bCount, cCount-1);
return (dp[n][bCount][cCount] = res);
}
// A wrapper over countStrUtil()
int countStr(int n)
{
int dp[n+1][2][3];
memset(dp, -1, sizeof(dp));
return countStrUtil(dp, n);
}
// Driver code
int main()
{
int n = 3; // Total number of characters
cout << countStr(n);
return 0;
}
Java
// Java program to count number of strings
// of n characters with
class GFG
{
// n is total number of characters.
// bCount and cCount are counts of 'b'
// and 'c' respectively.
static int countStrUtil(int[][][] dp, int n,
int bCount, int cCount)
{
// Base cases
if (bCount < 0 || cCount < 0)
{
return 0;
}
if (n == 0)
{
return 1;
}
if (bCount == 0 && cCount == 0)
{
return 1;
}
// if we had saw this combination previously
if (dp[n][bCount][cCount] != -1)
{
return dp[n][bCount][cCount];
}
// Three cases, we choose, a or b or c
// In all three cases n decreases by 1.
int res = countStrUtil(dp, n - 1, bCount, cCount);
res += countStrUtil(dp, n - 1, bCount - 1, cCount);
res += countStrUtil(dp, n - 1, bCount, cCount - 1);
return (dp[n][bCount][cCount] = res);
}
// A wrapper over countStrUtil()
static int countStr(int n, int bCount, int cCount)
{
int[][][] dp = new int[n + 1][2][3];
for (int i = 0; i < n + 1; i++)
{
for (int j = 0; j < 2; j++)
{
for (int k = 0; k < 3; k++)
{
dp[i][j][k] = -1;
}
}
}
return countStrUtil(dp, n,bCount,cCount);
}
// Driver code
public static void main(String[] args)
{
int n = 3; // Total number of characters
int bCount = 1, cCount = 2;
System.out.println(countStr(n,bCount,cCount));
}
}
// This code has been contributed by 29AjayKumar
Python3
# Python 3 program to count number of strings
# of n characters with
# n is total number of characters.
# bCount and cCount are counts of 'b'
# and 'c' respectively.
def countStrUtil(dp, n, bCount=1,cCount=2):
# Base cases
if (bCount < 0 or cCount < 0):
return 0
if (n == 0):
return 1
if (bCount == 0 and cCount == 0):
return 1
# if we had saw this combination previously
if (dp[n][bCount][cCount] != -1):
return dp[n][bCount][cCount]
# Three cases, we choose, a or b or c
# In all three cases n decreases by 1.
res = countStrUtil(dp, n-1, bCount, cCount)
res += countStrUtil(dp, n-1, bCount-1, cCount)
res += countStrUtil(dp, n-1, bCount, cCount-1)
dp[n][bCount][cCount] = res
return dp[n][bCount][cCount]
# A wrapper over countStrUtil()
def countStr(n):
dp = [ [ [-1 for x in range(n+2)] for y in range(3)]for z in range(4)]
return countStrUtil(dp, n)
# Driver code
if __name__ == "__main__":
n = 3 # Total number of characters
print(countStr(n))
# This code is contributed by chitranayal
C#
// C# program to count number of strings
// of n characters with
using System;
class GFG
{
// n is total number of characters.
// bCount and cCount are counts of 'b'
// and 'c' respectively.
static int countStrUtil(int[,,] dp, int n,
int bCount=1, int cCount=2)
{
// Base cases
if (bCount < 0 || cCount < 0)
return 0;
if (n == 0)
return 1;
if (bCount == 0 && cCount == 0)
return 1;
// if we had saw this combination previously
if (dp[n,bCount,cCount] != -1)
return dp[n,bCount,cCount];
// Three cases, we choose, a or b or c
// In all three cases n decreases by 1.
int res = countStrUtil(dp, n - 1, bCount, cCount);
res += countStrUtil(dp, n - 1, bCount - 1, cCount);
res += countStrUtil(dp, n - 1, bCount, cCount - 1);
return (dp[n, bCount, cCount] = res);
}
// A wrapper over countStrUtil()
static int countStr(int n)
{
int[,,] dp = new int[n + 1, 2, 3];
for(int i = 0; i < n + 1; i++)
for(int j = 0; j < 2; j++)
for(int k = 0; k < 3; k++)
dp[i, j, k] = -1;
return countStrUtil(dp, n);
}
// Driver code
static void Main()
{
int n = 3; // Total number of characters
Console.Write(countStr(n));
}
}
// This code is contributed by DrRoot_
Java脚本
输出 :
19
时间复杂度: O(n)
辅助空间: O(n)
感谢Lazy先生提出上述解决方案。
在O(1)时间内有效的解决方案:
C++
// A O(1) CPP program to find number of strings
// that can be made under given constraints.
#include
using namespace std;
int countStr(int n)
{
return 1+(n*2)+(n*((n*n)-1)/2);
}
// Driver code
int main()
{
int n = 3;
cout << countStr(n);
return 0;
}
Java
// A O(1) Java program to
// find number of strings
// that can be made under
// given constraints.
import java.io.*;
class GFG
{
static int countStr(int n)
{
return 1 + (n * 2) +
(n * ((n * n) - 1) / 2);
}
// Driver code
public static void main (String[] args)
{
int n = 3;
System.out.println( countStr(n));
}
}
// This code is contributed by ajit
的Python 3
# A O(1) Python3 program to find
# number of strings that can be
# made under given constraints.
def countStr(n):
return (1 + (n * 2) +
(n * ((n * n) - 1) // 2))
# Driver code
if __name__ == "__main__":
n = 3
print(countStr(n))
# This code is contributed
# by ChitraNayal
C#
// A O(1) C# program to
// find number of strings
// that can be made under
// given constraints.
using System;
class GFG
{
static int countStr(int n)
{
return 1 + (n * 2) +
(n * ((n * n) - 1) / 2);
}
// Driver code
static public void Main ()
{
int n = 3;
Console.WriteLine(countStr(n));
}
}
// This code is contributed by m_kit
的PHP
Java脚本
输出 :
19