整体思路:维护两个位置的坐标,维护一个最长子串长度。一个是子串起点下标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;
}