📌  相关文章
📜  无限字符串的前N个字符中只有4个字符的最长子字符串

📅  最后修改于: 2021-05-08 17:57:25             🧑  作者: Mango

给定整数N,任务是从无限字符串str的前N个字符中找到仅包含4个字符的最长子字符串的长度。
字符串str是通过将仅45组成的数字按升序级联而生成的。例如4个,5,44,45,54,55等。因此,字符串str看起来像“ 4544455455444445454455…”

例子:

Input : N = 4 
Output : 2
First 4 characters of str are "4544". 
Therefore the required length is 2.

Input : N = 10
Output : 3
First 10 characters of str are "4544455455". 
Therefore the required length is 3.

方法:通过观察模式可以轻松解决问题。任务是计算出现在字符串的最大连续4个数字。因此,无需生成整个字符串。
如果将字符串分成不同的组,则可以观察到一种模式,因为第一组将有2个字符,第二组将有4个字符,第三组将有8个字符,依此类推。

例如

现在,任务简化为查找N所在的组,以及从一开始就在该组中覆盖了多少个字符。
这里,

  • 如果N属于第2组,则答案将至少为3。即,如果length = 4,则答案将为2,与长度4一样,字符串将仅覆盖该组中的第二个4,并且如果length = 5答案将是3。
  • 同样,如果长度至少覆盖了第3组中的前5个“ 4”,则答案为5。

现在,
组1具有1 * 2 ^ 1个字符
组2具有2 * 2 ^ 2个字符
通常,组K具有K * 2 ^ K个字符。因此,问题减少到找到给定的N属于哪个组。这可以通过使用前缀求和数组pre []轻松找到,其中第ith个元素包含不超过第ith个字符数之和。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
#define MAXN 30
 
// Function to return the length of longest
// contiguous string containing only 4’s from
// the first N characters of the string
int countMaxLength(int N)
{
    // Initialize result
    int res;
 
    // Initialize prefix sum array of
    // characters and product variable
    int pre[MAXN], p = 1;
 
    // Preprocessing of prefix sum array
    pre[0] = 0;
    for (int i = 1; i < MAXN; i++) {
        p *= 2;
        pre[i] = pre[i - 1] + i * p;
    }
 
    // Initialize variable to store the
    // string length where N belongs to
    int ind;
 
    // Finding the string length where
    // N belongs to
    for (int i = 1; i < MAXN; i++) {
        if (pre[i] >= N) {
            ind = i;
            break;
        }
    }
 
    int x = N - pre[ind - 1];
    int y = 2 * ind - 1;
 
    if (x >= y)
        res = min(x, y);
    else
        res = max(x, 2 * (ind - 2) + 1);
 
    return res;
}
 
// Driver Code
int main()
{
    int N = 25;
    cout << countMaxLength(N);
 
    return 0;
}


Java
// Java implementation of the approach
class GFG
{
     
static int MAXN = 30;
 
// Function to return the length of longest
// contiguous string containing only 4's from
// the first N characters of the string
static int countMaxLength(int N)
{
    // Initialize result
    int res;
 
    // Initialize prefix sum array of
    // characters and product variable
    int pre[] = new int[MAXN];
    int p = 1;
 
    // Preprocessing of prefix sum array
    pre[0] = 0;
    for (int i = 1; i < MAXN; i++)
    {
        p *= 2;
        pre[i] = pre[i - 1] + i * p;
    }
 
    // Initialize variable to store the
    // string length where N belongs to
    int ind = 0;
 
    // Finding the string length where
    // N belongs to
    for (int i = 1; i < MAXN; i++)
    {
        if (pre[i] >= N)
        {
            ind = i;
            break;
        }
    }
 
    int x = N - pre[ind - 1];
    int y = 2 * ind - 1;
 
    if (x >= y)
        res = Math.min(x, y);
    else
        res = Math.max(x, 2 * (ind - 2) + 1);
 
    return res;
}
 
// Driver Code
public static void main(String[] args)
{
    int N = 25;
    System.out.println(countMaxLength(N));
}
}
 
// This code is contributed by Code_Mech.


Python3
# Python 3 implementation of the approach
MAXN = 30
 
# Function to return the length of longest
# contiguous string containing only 4’s from
# the first N characters of the string
def countMaxLength(N):
     
    # Initialize result
    # Initialize prefix sum array of
    # characters and product variable
    pre = [0 for i in range(MAXN)]
    p = 1
 
    # Preprocessing of prefix sum array
    pre[0] = 0
    for i in range(1, MAXN, 1):
        p *= 2
        pre[i] = pre[i - 1] + i * p
 
    # Initialize variable to store the
    # string length where N belongs to
 
    # Finding the string length where
    # N belongs to
    for i in range(1, MAXN, 1):
        if (pre[i] >= N):
            ind = i
            break
 
    x = N - pre[ind - 1]
    y = 2 * ind - 1
 
    if (x >= y):
        res = min(x, y)
    else:
        res = max(x, 2 * (ind - 2) + 1)
    return res
 
# Driver Code
if __name__ == '__main__':
    N = 25
    print(countMaxLength(N))
 
# This code is contributed by
# Surendra_Gangwar


C#
// C# implementation of the approach
using System;
 
class GFG
{
     
static int MAXN = 30;
 
// Function to return the length of longest
// contiguous string containing only 4's from
// the first N characters of the string
static int countMaxLength(int N)
{
    // Initialize result
    int res;
 
    // Initialize prefix sum array of
    // characters and product variable
    int[] pre = new int[MAXN];
    int p = 1;
 
    // Preprocessing of prefix sum array
    pre[0] = 0;
    for (int i = 1; i < MAXN; i++)
    {
        p *= 2;
        pre[i] = pre[i - 1] + i * p;
    }
 
    // Initialize variable to store the
    // string length where N belongs to
    int ind = 0;
 
    // Finding the string length where
    // N belongs to
    for (int i = 1; i < MAXN; i++)
    {
        if (pre[i] >= N)
        {
            ind = i;
            break;
        }
    }
 
    int x = N - pre[ind - 1];
    int y = 2 * ind - 1;
 
    if (x >= y)
        res = Math.Min(x, y);
    else
        res = Math.Max(x, 2 * (ind - 2) + 1);
 
    return res;
}
 
// Driver Code
public static void Main()
{
    int N = 25;
    Console.WriteLine(countMaxLength(N));
}
}
 
// This code is contributed by Code_Mech.


PHP
= $N)
        {
            $ind = $i;
            break;
        }
    }
 
    $x = $N - $pre[$ind - 1];
    $y = 2 * $ind - 1;
 
    if ($x >= $y)
        $res = min($x, $y);
    else
        $res = max($x, 2 * ($ind - 2) + 1);
 
    return $res;
}
 
// Driver Code
$N = 25;
echo countMaxLength($N);
 
// This code is contributed by Ryuga
?>


Javascript


输出:
5