无重复字符的最长子串

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int len = s.length();
        // 对于字符串长为0时特殊处理(这里需要这么做,是因为最后答案输出时是ans + 1
        if(len == 0) return 0;
        //头尾下标指针初始化
        int st = 0, en = 0;
        int ans = 0;
        bool ch[128];
        // ch数组按照ASCII码的值记录每个字符是否已被使用
        memset(ch, false, sizeof(ch));
        // 记录第一位的字符
        ch[s[0]] = true;
        // 注意,因为String存储范围的下标其实是 0..(len-1),因此全部处理成en + 1 < len
        while(en + 1 < len)
        {
            // 利用贪心,如果下一位超出String范围,或是已被使用过,则退出循环
            while(en + 1 < len && !ch[s[en + 1]])
            {
                en ++;
                ch[s[en]] = true;
            }
            // 由于ans存储的是尾指针-头指针的数值,因此比实际长度小1
            ans = max(ans, en - st);
            // 头指针后移一位
            ch[s[st]] = false;
            st ++;
        }
        // 这里使用ans + 1输出是为了将len = 1的情况一起包括进来,感兴趣的码友可以尝试一下此类数据
        return ans + 1;
    }
};

作者:iswJXkYVv3
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/c-8ms93mb-jian-dan-tan-xin-by-iswjxkyvv3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

可完整运行的c程序版:

 

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

    int lengthOfLongestSubstring(char *s) {
        int len = strlen(s);
        if(len == 0) return 0;
        int st = 0, en = 0;
        int ans = 0;
        bool ch[128];
        memset(ch, false, sizeof(ch));
        ch[s[0]] = true;
        while(en + 1 < len)
        {   
            while(en + 1 < len && !ch[s[en + 1]])
            {
                en ++;
                ch[s[en]] = true;
            }
             if (ans<en - st) ans=en-st;
             
            for( ;;st++)
            {
                
                if (s[st]==s[en+1])
                {
                    st=st+1;
                    break;          
                }
                else
                {
                    ch[s[st]]=false;
                    
                }
            }        
            en=en+1; 
            

    }
        return ans+1;
    }


int main(void) { 
    char  *msg;
    msg = (char *) "abcbb";
    int len=lengthOfLongestSubstring(msg);
    printf("%d",len);
    return 0;
}

 

posted @ 2020-02-03 15:42  扫驴  阅读(161)  评论(0编辑  收藏  举报