当前位置 博文首页 > Sunny-Shi的博客:Leetcode无重复字符的最长子串 C语言

    Sunny-Shi的博客:Leetcode无重复字符的最长子串 C语言

    作者:[db:作者] 时间:2021-09-17 18:15

    题目

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

    示例 1:

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

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

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

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

    题解简易思路

    sn数组记录每个字符在字符串中出现的位置(值为坐标i+1)
    cur为当前检索的字符串的首字符的位置
    len当前检索的没有重复字符串的长度
    max没有重复字符的最大长度
    当所检测的字符没有出现过sn[s[i]]==0或者不在当前检测的字符串的范围内时sn[s[i]]<cur
    更新sn的值,并且长度增加,索引i增加
    否则,出现重复的字符,更新max的值,记录最长字符串的长度,修改当前检索的字符串的首字符的位置(即重复字符之前出现的位置sn[s[i]]的值),修改当前检索的字符串的长度(i-cur+1),继续检索下一个字符
    时间复杂度O(n)

    
    ```c
    int lengthOfLongestSubstring(char * s){
        int max=0,i=0,cur=0,length,len=0;
        length=strlen(s);
        if(length<=1) return length;
        int sn[256]={0};
        while(s[i]!=NULL){
            if(sn[s[i]]==0||sn[s[i]]<cur){
                sn[s[i]]=i+1;
                len++;
                i++;
            }
            else{
                max=max>len?max:len;
                cur=sn[s[i]];
                len=i-cur+1;
                sn[s[i]]=i+1;
                i++;
            }
        }
        max=max>len?max:len;
        return max;
    }
    
    cs