方法一:暴力求解
思路:直接将该字符串的每一个字串都遍历一遍,查找出不重复的最大字串
带大家分析一下代码的大体写法,首先遍历字串要有两个下标,两层循环,这个大家都会,而判断字符串不重复,还是用两层循环,两两比较,看是否有重复的,而这四个循环是套在一起的,时间复杂度可想而知很大,不建议大家使用这种算法,代码就不写了。
下面讲一种更加简洁明了的算法
方法二:滑动窗口
顾名思意就是将指针动起来,来回滑动,确定区间
如下图
有字符串abcabcdd,首先我们先定义两个指针 i、j,指向的空间看作是一个窗口,我们要先确定中间的子串是否重复,如果没有,j往后移,如果有i和j同时往后移
当出现重复字符的时候,记录字串的大小,并将 i 移动到第一个重复字符的下一个字符处,可以节省时间
如此反复,就可以得到最大不重复子串
代码如下
int lengthOfLongestSubstring(char* s) {
if(*s=='\0')//空字符的情况
return 0;
int len = strlen(s);
int i = 0, j = 1;
int max = 1,count = 1;//max存放最大值,count是变化的字串长度
while (i < len && j < len)
{
int k = 0;//寻找重复的字符
for (k = i; k < j; k++)
if (s[k] == s[j])
break;
if (k == j)//没找到
{
count++;
j++;
if (max < count)//只有在没找到的情况下才有可能大于已知的max
max = count;
}
else//找到重复字符
{
count=count-(k-i+1);//更新长度
i=k+1;//更新下标
}
}
return max;
}