整体思路:维护两个位置的坐标,维护一个最长子串长度。一个是子串起点下标start,一个是终点下标end(注意:这里end一直在++,所以是子串终点的下一个位置,那么长度就是end-start,而不需要再+1)。然后用一个数组arr存储每个字符对应的字符串中的位置,end即终点每次循环遍历字符串时一直+1,start起点初始为1。当end遇到字符串中这个字符在数组arr中已经有之前存储过下标,说明当前子串有重复的字符了,那就先判断当前子串长度是否比max大,大的话max为当前子串长度。然后把start移到arr[s[i]] + 1位置(arr[s[i]]位置已经重复,所以+1),然后再把原start到arr[s[i]]位置之间的字符存储的下标数据清除即可。最后查找字符串for循环结束,有可能到最后一个字符都没重复,那就再最后判断一下max和end-start的关系就好了。

#include <string.h>
int lengthOfLongestSubstring(char* s ) {
    // write code here
    int length = strlen(s);
    if(length < 2)
    {
        return length;
    }
    int start = 0;
    int end = 0;
    int arr[128];
    for(int i = 0; i < 128; i++)
    {
        arr[i] = -1;
    }
    int max = 0;
    for(int i = 0; i < length; i++)
    {
        if(arr[s[i]] != -1)
        {
            if(max < end - start)
            {
                max = end - start;
            }
            int mid = arr[s[i]] + 1;    
            for(int j = start; j < arr[s[i]] + 1; j++)
            {
                arr[s[j]] = -1;
            }
            start = mid;
            arr[s[i]] = i;
        }
        else
        {
            arr[s[i]] = i;
        }
        end++;
    }
    if(max < end - start)
    {
        max = end - start;
    }
    return max;
}