无限字符串前 N 个字符中仅包含数字 4 的最长子字符串


介绍

在本教程中,我们将实现一种方法,利用无限字符串的前 N 个字符来查找仅包含数字 4 的最长子字符串。无限字符串使用数字 4,看起来像这样:“44444444……”,对于此字符串,我们定义了要考虑的字符长度以解决任务。为了解决本教程的问题,请考虑一个输入数字字符串,我们将使用以下两个条件来解决此问题:

  • 考虑一个包含随机数字的输入字符串,并从该字符串中生成仅包含数字 4 的最长子字符串。

  • 我们考虑一个由 4、5、44、45 等组合组成的无限字符串。此字符串将包含按升序排列的 4 和 5 的组合的数字。使用此字符串查找仅包含数字 4 的最长子字符串的长度。

演示 1

String = “3444445443”

输出

the longest substring containing 4’s is 44444

解释

在上述输入字符串 444445443 中,存在 3、4 和 5。任务是生成一个仅包含数字 4 的子字符串。因此,使用输入字符串执行任务的输出为 44444。

演示 2

在此演示中,我们采用一个按升序排列的 4 和 5 数字组合的输入字符串。我们定义输入字符串的长度,并以仅包含数字 4 的最长子字符串的长度的形式生成输出。

Total characters in the string = 6

输出

3

解释

我们为输入字符串取 6 个字符,生成的输入字符串为 454445。使用此字符串,使用前 N 个字符仅包含数字 4 的子字符串的长度为 3。

演示 3

Length of the string = 8

输出

3

输入字符串的长度为 8,为此,可能的输入字符串为 45444554。使用初始字符仅包含数字 4 的子字符串的长度为 3。

C++ 库函数

语法

length() : 这是一个字符串类库函数,用于返回字符串的长度。字符串的字节格式长度是字符串中所有字符的总和。

string_name.length();

substr(): 它定义在字符串类头文件中。它使用输入字符串生成子字符串。它接受 2 个参数:begin,length。

string_name.substr(begin, length); 

算法 1

  • 获取输入字符串长度。

  • 函数 maxlengthSubstr() 返回仅包含数字 4 的最长子字符串的长度。

  • 初始化一个前缀数组以生成可能的输入字符串组合。

  • 该数组将从数组变量迭代到 MAXN。

  • 通过计算 result 变量值来查找子字符串的长度。

示例 1

在此实现中,用户定义的函数 maxLengthSubstr() 返回仅包含数字 4 的最长子字符串的长度。初始化一个 pre_arr{} 来计算长度。不要完整生成输入字符串,而是指定其长度。常量变量 MAXN 在代码开头定义。

其 C++ 实现如下:

#include <bits/stdc++.h>
using namespace std;
#define MAXN 30
 
// Function returning the length of the longest substring containing only 4
int maxLengthSubstr(int Num)
{
    //variable containing the result
    int ans;
 
    // Initialize array to make groups
    int pre_arr[MAXN], q = 1;

    pre_arr[0] = 0;
    for (int x = 1; x < MAXN; x++)
    {
        q *= 2;
        pre_arr[x] = pre_arr[x - 1] + x * q;
    }

    int l;
 
 //Finding the length of the longest substring
    for (int x = 1; x < MAXN; x++) 
    {
        if (pre_arr[x] >= Num) 
        {
            l = x;
            break;
        }
    }
 
    int i = Num - pre_arr[l - 1];
    int j = 2 * l - 1;
 
    if (i >= j)
        ans = min(i, j);
    else
        ans = max(i, 2 * (l - 2) + 1);
 
    return ans;
}
 
// Controller
int main()
{
    int Num = 8;
    cout << "Maximum length of the longest substring of 8 string characters containing only 4s is : " << maxLengthSubstr(Num);
 
    return 0;
}

输出

Maximum length of the longest substring of 8 string characters containing only 4s is : 3

示例 2

在此实现中,用户定义的函数 longestSubstr() 返回使用输入字符串的前 N 个字符仅包含数字 4 的最长子字符串。输入字符串的每个字符都与数字 4 进行比较,当匹配时,计数器变量的值增加。

以下是上述说明的 C++ 实现。

#include <iostream>
#include <string>
using namespace std;

//function returning the longest substring containing only 4
string longestSubstring(const string& str) 
{
    int maxLen = 0;
    int start = 0;
    int currentLen = 0;
    int currentStartIndex = 0;

//iterating characters of the string
    for (int x = 0; x < str.length(); x++) 
    {
        if (str[x] == '4') 
        {
            if (currentLen == 0) 
            {
                currentStartIndex = x;
                currentLen = 1;
            }
            else 
            {
                currentLen++;
            }

            if (currentLen > maxLen) 
            {
                maxLen = currentLen;
                start = currentStartIndex;
            }
        } 
        else 
        {
            currentLen = 0;
        }
    }

    string longestSubstr = str.substr(start, maxLen);
    return longestSubstr;
}

//Controller
int main() 
{
    string str = "344444405474444";
    
    string longestSubstr = longestSubstring(str);
    cout << "Longest substring of only 4's: " << longestSubstr << endl;

    return 0;
}

输出

Longest substring of only 4's: 44444

结论

我们已经完成了从输入字符串的前 N 个字符中查找仅包含数字 4 的最长子字符串的任务。这是使用 C++ 逻辑完成的。第一个解决方案涉及将输入字符串中的每个字符进行比较,以查找仅包含数字 4 的最长子字符串。在第二个解决方案中,确定仅包含数字 4 的最长子字符串的长度。这是通过使用一个包含数字 4 和 5 按升序排列的字符串(如 4、5、44、45……)来完成的。

这两个解决方案都通过使用一些 C++ 库函数帮助解决了问题。一些演示用于详细说明问题陈述的目的。

更新于: 2023-08-18

81 次浏览

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告