给定字符串str 。任务是计算所有可能不同的字符串的数量,如果该字符串的两个连续的相同的字符可以通过一个不同的字符来代替。
例子
Input: str = “abclll”
Output: 3
Explanation:
There can be 3 different string including the original string as shown in the below figure:-
Input: str = “abcllldefkkkk”
Output: 15
Explanation:
There can be 15 different string including the original string as shown in the below figure:-
方法:
观察到以下属性用于一次替换两个等号字符:
- 如果对于长度为 3 的字符串 = “aaa ”,我们将两个“aa”替换为一个字符“K”,那么包括原始字符串在内的不同可能字符串的总数为:- Ka, aK, aaa 。因此不同字符串的数目如下Fibonacci数的字符串中的连续字符的长度的财产。
- 如果 for 字符串 = “ aaadefyyyy ” 那么可能的不同字符串的总数等于字符串“aaa”和“yyyy”一次替换两个连续字符的组合的乘积。
因此,根据以上两个观察,具有N个连续字符的不同可能字符串的计数由第 N 个斐波那契数给出。因此,对于给定的字符串str不同的可能的字符串的总数等于不同的可能字符串的计数与所有相同的字符每个子产品。
以下是步骤:
- 计算(比如 cnt )给定字符串str中相同的连续字符的数量。
- 要计算为计数CNT的不同可能的字符串,找到斐波那契序列的CNT值。
- 对给定字符串str中的所有连续字符重复上述步骤。
- 不同可能字符串的总数等于每次连续字符计数所获得的斐波那契数列的所有值的乘积。
下面是上述方法的实现:
C++
// C++ program to count the
// different possible string
// form by replacing two same
// characters with one
#include
using namespace std;
// Array to find the fibonacci
// sequence
int fib[100005];
// Function to find the
// fibonacci sequence
void computeFibonacci()
{
fib[0] = 1;
fib[1] = 1;
for (int i = 2; i < 100005; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
}
}
// Function to count all
// possible strings
int countString(string str)
{
// Initialize ans = 1
int ans = 1;
int cnt = 1;
for (int i = 1; str[i]; i++) {
// If two consecutive
// char are same
// increase cnt
if (str[i] == str[i - 1]) {
cnt++;
}
// Else multiply the
// fib[cnt] to ans
// and initialize ans
// to 1
else {
ans = ans * fib[cnt];
cnt = 1;
}
}
//
// If str = abcdeeee, then
// for last "eeee" the
// count munst be updated
ans = ans * fib[cnt];
// Return the total count
return ans;
}
// Driver's Code
int main()
{
string str = "abdllldefkkkk";
// Function to precompute
// all the fibonacci number
computeFibonacci();
// Function call to find
// the count
cout << countString(str);
return 0;
}
Java
// Java program to count the
// different possible string
// form by replacing two same
// characters with one
class GFG {
// Array to find the fibonacci
// sequence
static int fib[] = new int[100005];
// Function to find the
// fibonacci sequence
static void computeFibonacci()
{
fib[0] = 1;
fib[1] = 1;
for (int i = 2; i < 100005; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
}
}
// Function to count all
// possible strings
static int countString(String str)
{
// Initialize ans = 1
int ans = 1;
int cnt = 1;
for (int i = 1; i
Python3
# Python3 program to count the
# different possible string
# form by replacing two same
# characters with one
# Array to find the fibonacci
# sequence
fib = [0]*100005;
# Function to find the
# fibonacci sequence
def computeFibonacci() :
fib[0] = 1;
fib[1] = 1;
for i in range(2, 100005) :
fib[i] = fib[i - 1] + fib[i - 2];
# Function to count all
# possible strings
def countString(string) :
# Initialize ans = 1
ans = 1;
cnt = 1;
for i in range(1, len(string)) :
# If two consecutive
# char are same
# increase cnt
if (string[i] == string[i - 1]) :
cnt += 1;
# Else multiply the
# fib[cnt] to ans
# and initialize ans
# to 1
else :
ans = ans * fib[cnt];
cnt = 1;
# If str = abcdeeee, then
# for last "eeee" the
# count munst be updated
ans = ans * fib[cnt];
# Return the total count
return ans;
# Driver's Code
if __name__ == "__main__" :
string = "abdllldefkkkk";
# Function to precompute
# all the fibonacci number
computeFibonacci();
# Function call to find
# the count
print(countString(string));
# This code is contributed by Yash_R
C#
// C# program to count the
// different possible string
// form by replacing two same
// characters with one
using System;
class GFG {
// Array to find the fibonacci
// sequence
static int []fib = new int[100005];
// Function to find the
// fibonacci sequence
static void computeFibonacci()
{
fib[0] = 1;
fib[1] = 1;
for (int i = 2; i < 100005; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
}
}
// Function to count all
// possible strings
static int countString(string str)
{
// Initialize ans = 1
int ans = 1;
int cnt = 1;
for (int i = 1; i < str.Length; i++) {
// If two consecutive
// char are same
// increase cnt
if (str[i] == str[i - 1]) {
cnt++;
}
// Else multiply the
// fib[cnt] to ans
// and initialize ans
// to 1
else {
ans = ans * fib[cnt];
cnt = 1;
}
}
// If str = abcdeeee, then
// for last "eeee" the
// count munst be updated
ans = ans * fib[cnt];
// Return the total count
return ans;
}
// Driver's Code
public static void Main (string[] args)
{
string str = "abdllldefkkkk";
// Function to precompute
// all the fibonacci number
computeFibonacci();
// Function call to find
// the count
Console.WriteLine(countString(str));
}
}
// This code is contributed by AnkitRai01
Javascript
输出:
15
时间复杂度: O(N),其中 N 是给定字符串的长度。