【Leetcode】3.无重复字符的最长字串

目录

题目:

2.思路

滑动窗口

3.代码

第一次循环

第二次循环

 第三次循环

 第四次循环


题目:

3. 无重复字符的最长子串

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

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
 

提示:

0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters
 

2.思路

滑动窗口

【Leetcode】3.无重复字符的最长字串_第1张图片

3.代码

int lengthOfLongestSubstring(char* s) {
    int begin = 0;//子串最开始下标
    int end = 0;//字串结束下标
    int max = 0;//字串长度最大值
    int count = 0;//统计子串中的字符个数

    if (*s == NULL)   //首先,判断该数组是否为空,若为空直接返回,否则进入循环
        return NULL;

    while (s[end]!='\0')//当循环到最后'\0'时,滑动窗口结束,跳出循环
    {
        count = 0;
        for (int i=begin;i<=end;i++)
        {
            count++;//查看此子串内有多少个字符,依次比较
            if (s[i]==s[end] && i != end)
            {
                begin = i + 1;
                break;
            }
        }
        if (count > max)
        {
            max = count;
        }
        end++;
    }
    return max;
}

int main()
{
	char s[] = "ab";
    
    int a = lengthOfLongestSubstring(s);
    printf("%d", a);

	return 0;
}

第一次循环

【Leetcode】3.无重复字符的最长字串_第2张图片

 由第一个字符开始比较,并得出它的长度

第二次循环

【Leetcode】3.无重复字符的最长字串_第3张图片

 第三次循环

【Leetcode】3.无重复字符的最长字串_第4张图片

 第四次循环

【Leetcode】3.无重复字符的最长字串_第5张图片

 此时,下标为3的字符与下标为0的字符相同,确定前三个字符为第一个不重复的子串,得出该子串长度,并将变量begin向右移动一位,再次组成一个不重复的子串,进行下一次循环,并将上一子串的长度与max进行比较,选择最大值

【Leetcode】3.无重复字符的最长字串_第6张图片

【Leetcode】3.无重复字符的最长字串_第7张图片

 最后循环上述操作

你可能感兴趣的:(Leetcode,leetcode,算法,职场和发展)