【C/C++刷题——leetcode】查找字符串中最大的子串

简介: 【C/C++刷题——leetcode】查找字符串中最大的子串

前言


在字符串处理中,经常需要寻找一个字符串中的最大子串。最大子串指的是在给定字符串中连续出现的长度最长的子串。本文将介绍如何使用C++/C语言来查找一个字符串中的最大子串。


一、示例


输入:"Hello everybody"
输出:"everybody"
输入:"i am C++"
输出:"C++"


空格分割每一个子字符串,遇到'\0'返回


二、要求分析


1、遍历字符串

对于此要求,我们肯定需要遍历整个字符串,才能求出他的最长字符串。

2、定义存储最长字符串的变量

定义存储上一个字符串的变量(如上面这个例子:我遍历到everybody了,那么上一个字符串就是Hello),定义存储现在的字符串(当遇到空格或者'\0'的时候自动给上一个字符串,并清空,好在下一次字符串使用)。创建后两个字符串的意义就是要比较得出最大字符串

3、如果无空格或'\0',在存储现在字符串里面尾添加
4、如果有,则去判断上一个字符串和现在存储的字符串哪个大,从而得出maxStr。


三、C语言版


1、遍历字符串:

  //由于strlen函数并不会加'\0',可以'\0'也是我们的一个判断的一个标准
  //所以需要+1
  int len = strlen(str) + 1;
    for (int i = 0; i < len; i++) 
    {
    }


2、定义存储字符串的变量:

字符数组也可以增大,或者有能力的同学也可以使用malloc等等方法动态申请

实现一个相对智能的函数

  int maxLen = 0;              // 最大子串长度
    char maxStr[100];            // 存储最大子串的字符数组
    char lastStr[100];           // 存储上一个子串的字符数组
    char ret[100];               // 存储当前子串的字符数组


3、如果无空格或'\0',在存储现在字符串里面尾添加:

ret[retLen++] = str[i];


4、如果有,则去判断上一个字符串和现在存储的字符串哪个大,从而得出maxStr。

if (strlen(lastStr) > maxLen) {
                strncpy(maxStr, lastStr, strlen(lastStr) + 1);
                maxLen = strlen(lastStr);
                retLen = 0;
            }
            else {
                strncpy(maxStr, ret, strlen(ret) + 1);
                strncpy(lastStr, ret, strlen(ret) + 1);
                maxLen = strlen(ret);
                retLen = 0;
            }


char* logestStr(const char* str) {
    int maxLen = 0;              // 最大子串长度
    char maxStr[100];            // 存储最大子串的字符数组
    char lastStr[100];           // 存储上一个子串的字符数组
    char ret[100];               // 存储当前子串的字符数组
    int retLen = 0;              // 当前子串的长度
    int len = strlen(str) + 1;
    for (int i = 0; i < len; i++) {
        if (str[i] == ' ' || str[i] == '\0') {
            if (strlen(lastStr) > maxLen) {
                strncpy(maxStr, lastStr, strlen(lastStr) + 1);
                maxLen = strlen(lastStr);
                retLen = 0;
            }
            else {
                strncpy(maxStr, ret, strlen(ret) + 1);
                strncpy(lastStr, ret, strlen(ret) + 1);
                maxLen = strlen(ret);
                retLen = 0;
            }
            continue;
        }
        else {
            ret[retLen++] = str[i];
        }
    }
    return maxStr;
}


四、C++版


1、遍历字符串:

  //由于string::length()函数并不会加'\0',可以'\0'也是我们的一个判断的一个标准
  //所以需要+1
  int len = str.length()+1;
    for(int i = 0;i<len;i++)
    {
    }


2、定义存储字符串的变量:

  string ret;//记录这次的字符串
    string lastStr;//记录上次的字符串
    string maxStr;//最长的字符串,最后用于返回


3、如果无空格或'\0',在存储现在字符串里面尾添加:

ret.append(1,str[i]);//尾添加字符串


4、如果有,则去判断上一个字符串和现在存储的字符串哪个大,从而得出maxStr。

if(lastStr.length() > ret.length())//上次的字符串比这次的大,maxstr赋值成上次的字符串
{
      maxStr = lastStr;
      ret = "";//存储现在字符串清空,好下次使用
}
else
{
      maxStr = ret;//最大的是此次字符串,赋值给maxstr
      lastStr = ret;//我们需要存储起lastStr好下次对比
      ret = "";//存储现在字符串清空,好下次使用
}


全部代码如下

string logestStr(const string &str)
{
    int Strcount = 0;
    string ret;//记录这次的字符串
    string lastStr;//记录上次的字符串
    string maxStr;//最长的字符串,最后用于返回
  //由于string::length()函数并不会加'\0',可以'\0'也是我们的一个判断的一个标准
  //所以需要+1
    int len = str.length()+1;
    for(int i = 0;i<len;i++)
    {
        if(str[i] == ' ' || str[i]== '\0')//当遇到分隔符的时候
        {
            if(lastStr.length() > ret.length())//上次的字符串比这次的大,maxstr赋值成上次的字符串
            {
                maxStr = lastStr;
                ret = "";//存储现在字符串清空,好下次使用
            }
            else
            {
                maxStr = ret;//最大的是此次字符串,赋值给maxstr
                lastStr = ret;//我们需要存储起lastStr好下次对比
                ret = "";//存储现在字符串清空,好下次使用
            }
            continue;//执行下一次循环
        }
        else
        {
            ret.append(1,str[i]);//尾添加字符串
        }
    }
    return maxStr;
}


我们还可以实现他一个重载函数,以便char数组使用:

char *logestStr(const char *str)
{
    return const_cast<char*>(logestStr(string(str)).c_str());
}


重载函数代码分析:

由于logestStr(string).c_str()他的返回值是一个const char *,但是我们的返回值是char*,因为我们也不知道使用者是否会操作这个char*,所以我们不要写const char*

所以我们就需要使用const_cast去除const属性,然后通过return返回就可以了


总结


通过以上代码,我们可以利用C++/C语言来查找一个字符串中的最大子串。这个函数的实现利用循环遍历字符串,通过比较字符的连续性来确定最大子串的位置和长度,并提取出最大子串作为结果。


总结一下,本文介绍了如何使用C++/C语言来查找一个字符串中的最大子串。通过编写一个辅助函数,我们能够方便地在程序中进行最大子串的查找,为字符串处理提供了便利。

相关文章
|
2月前
|
机器学习/深度学习 算法
力扣刷题日常(一)
力扣刷题日常(一)
20 2
|
2月前
|
存储 算法 编译器
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
48 1
|
21天前
|
算法 Java C语言
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
|
2月前
|
存储 C++ 索引
C++ 字符串完全指南:学习基础知识到掌握高级应用技巧
C++的字符串使用`string`类处理,如`string greeting = &quot;Hello&quot;`。字符串连接可通过`+`或`append()`函数实现。访问字符使用索引,如`myString[0]`。`length()`或`size()`可获取长度。`getline()`用于读取整行输入。注意转义字符如`\\&quot;`用于在字符串中嵌入双引号。使用`cin`读取字符串时,空格会终止输入,而`getline()`能读取整行。
25 0
|
7天前
|
存储 编译器 C语言
C++字符串大小写之for语句
C++字符串大小写之for语句
13 0
|
9天前
|
C++
【代码片段】【C++】获取当前时间戳并生成固定格式字符串
【代码片段】【C++】获取当前时间戳并生成固定格式字符串
11 0
|
10天前
刷题之Leetcode160题(超级详细)
刷题之Leetcode160题(超级详细)
11 0
|
10天前
刷题之Leetcode206题(超级详细)
刷题之Leetcode206题(超级详细)
21 0
刷题之Leetcode206题(超级详细)
|
10天前
|
索引
刷题之Leetcode707题(超级详细)
刷题之Leetcode707题(超级详细)
13 0
|
10天前
|
索引
刷题之Leetcode35题(超级详细)
刷题之Leetcode35题(超级详细)
13 0