eg s[6]=p w w e k w
0 1 2 3 4 5
最初字母出现的个数:a[s[i]-'a']=0,计数器最初:k=0(if(max<k)max=k)
从数组下标0开始遍历P,因a[s[0]-'a']=0,则a[s[0]-'a']=1,计数器k+1=1,max=1;
遍历w,因a[s[1]-'a']=0,则a[s[1]-'a']=1,计数器;k+1=2,max=2;
遍历w,因a[s[2]-'a']=1,故从此数开始遍历,则a[s[2]-'a']=1,计数器;k+1=1,max=1;
遍历e,a[s[3]-'a']=0,则a[s[3]-'a']=1,计数器;k+1=2,max=2;
遍历k,a[s[4]-'a']=0,则a[s[4]-'a']=1,计数器;k+1=3;max=3;
遍历w,因a[s[5]-'a']=1,故从此数开始遍历,则a[s[5]-'a']=1,计数器;k+1=1,max=3;
return max,end
#include<stdio.h>
#include<string.h>
int lengthOfLongestSubstring(char *s){
int len=strlen(s);//求字符串长度
int a[26]={0},i=0,k=0,max=0;
//k为计数器,初值为0,max为最大的无重复字符数,a[26]={0}为将字母出现的字数初始化为0;
while(i<len)//字母遍历完,跳出循环
{
if(a[s[i]-'a']==0)//若字母没有被遍历过
{
k++; //计数器+1
a[s[i]-'a']++;//字母出现的次数+1
if(k>max)max=k; //更新最大的无重复字符数
}
else //若字母被遍历过,从这个字母开始再继续上述操作(包括此字母)
{
a[s[i]-'a']=1;//so将此字母出现次数+1
k=1; //由于包含此字母,故计数器+1
}
i++;//继续遍历下一个字母
}
return max;
}
int main()
{
char s[20];
int x;
scanf("%s",&s);
x=lengthOfLongestSubstring(s);
printf("%d",max);
return 0;
}