欢迎来到军工软件开发人才培养基地——学到牛牛

力扣题库3. 无重复字符的最长子串

时间:2024-05-06 07:01:10 来源:学到牛牛

题目描述:给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。

示例1:

输入: s = "abcabcbb" 

输出: 3 

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

 

示例2:

输入: s = “bbbbb”

输出: 1

解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

 

题解:

题目要求我们选择最长无重复的子串,首先得明白子串和子序列的区别

子串为字符串中连续的字符,是不可被分割的

子序列为字符串中的字符,是可被分割的

基本思想:定义两个指针分别指向当前无重复字符串的首和尾,然后蠕动遍历全部字符。

第一步:分别定义头、尾指针都指向字符串的首字符

第二步:尾指针先向后一步,检查前面有没有与尾字符重复的字符,有则将头指针移到重复的字符的下一位

第三步:通过第2步获得了新的无重复字符串,根据头尾指针计算长度并记录,重复第二步直到遍历结束

第四步:返回最大的长度

 

完整代码:

#include <stdio.h>

 

int lengthOfLongestSubstring(char *str)

{

    char *trail = str;   //  定义尾指针指向字符串的首字符

    char *head = str;   //   定义头指针指向字符串的首字符

    int max = 0;    //  定义一个整型变量用来存储字符串中子串的最大长度

    while (*trail != ‘\0’)  // 当尾指针指向字符串结束符‘\0’则退出循环

    {

        char *fp;

 // 再次定义一个指针fp指向头指针指向的字符串的字符,但是不能等于或者超过尾指针指向的字 符串的字符,蠕动遍历当前的无重复子串

        for (fp = head; fp < trail; fp++)

        {

  // 判断指针fp当前指向的字符串的字符是否恒等于尾指针指向的字符串的字符,如果恒等于则表示该无重复子串遍历结束,将头指针移到fp当前指向的字符串的字符的下一位

 

            if (*fp == *trail)    

         {

                head = fp + 1;

                break;

            }

        }

        max = trail - head + 1 > max ? trail - head + 1 : max; // 算出最长子串的长度

        trail++;

        }

    return max;  // 返回最大长度

}

int main()

{

    char str[] = {"aaaabcaaba"};

    int max = lengthOfLongestSubstring(str);

    printf("max = %d\n",max);

    return 0;

}