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

38 阅读1分钟

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

中等

相关标签

premium lock icon相关企业

提示

给定一个字符串 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 由英文字母、数字、符号和空格组成

题解:

ASCII码总共有128个,定义一个128的数组就可以在O(1)时间内查重。 使用滑动窗口

bug:while循环中,right++应该放在循环末尾,自增后马上进入循环条件检测,原来是放在开头,循环时候right会多扫描一个位,答案多1。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int max(int a, int b)
{
    return a >= b?a:b;
}

int main()
{
    char str[50000] = {'\0'};
    gets(str);
    int ascii[128] = {0};
    int left = 0, right = 0, size, maxlength = 1, length = 1;
    size = strlen(str);

    if (size == 0)
    {
        printf("0");
        return 0;
    }
    else if (size == 1)
    {
        printf("1");
        return 0;
    }
    ascii[str[left]] ++;
    while (left <= right && right <= size - 1)
    {
        if (ascii[str[right]] == 1)
        {
            maxlength = max(maxlength, length);
        }
        else if (ascii[str[right]] > 1)
        {
            while (ascii[str[right]] > 1)
            {
                ascii[str[left]] --;
                left ++;
                length  = right - left + 1;
            }
        }
        right ++;
        ascii[str[right]] ++;
        length = right - left + 1;
    }
    printf("%d", maxlength);
    return 0;
}