题目:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
思路:
定义一个新的字符数组new用来存放当前不重复的字符,令i遍历s字符串,初始时将s[i]放入new。让j = i+1开始,比较s[j]和new中的字符,如果s[j]和new中的字符都不相等,就把s[j]放进去,并且j向后移动;如果遇到s[j]和new中字符有相等的了,那么就保存new中字符个数,与max比较,留大的,然后清空new,i向后移动,重复上述步骤。
例如,初始时i = 0,那么new = {a},count = 1(count为new中元素个数),j = i+1=1,s[j] = b 不属于new,
那么 new = {a,b},count = 2. j继续向后移,s[j] = c不属于new,
那么new={a,b,c},count=3. j继续向后移,s[j] = a属于new, 此时count > max ,需要更新max值
i向后移,i = 1,那么 new={b},count = 1.s[j] = c不属于new.j++
new = {b,c},count = 2.s[j]=a不属于new.j++
new = {b,c,a} count = 3.s[j] = b属于new .count = max 不用更新new
i = 2 ,......
i只需要遍历到length-max就可以了。因为最后剩的长度如果比max小,就没啥再算的必要了
非常的暴力。。。小白只能这个样子了(╥╯^╰╥)
代码:
int lengthOfLongestSubstring(char * s){
int i,j;
int length = strlen(s);
int max = 0;
char new[length+1];
for(i = 0;i < length-max;i++)
{
new[0] = s[i];
int count = 1;
for(j = i+1;j < length;j++)
{
int t;
for(t = 0;t < count;t++)
if(new[t] == s[j])
{
if(count >max)
max = count;
break;
}
if(t!=count) break;
new[count] = s[j];
count++;
}
if(count >max)
max = count;
}
return max;
}
要点:
1.计算字符串长度:strlen(s)
2.max要从0开始,因为有字符串味空的情况