无重复字符的最长子串


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)

  1. 从数组下标0开始遍历P,因a[s[0]-'a']=0,则a[s[0]-'a']=1,计数器k+1=1,max=1

  2. 遍历w,因a[s[1]-'a']=0,则a[s[1]-'a']=1,计数器;k+1=2,max=2

  3. 遍历w,因a[s[2]-'a']=1,故从此数开始遍历,则a[s[2]-'a']=1,计数器;k+1=1,max=1

  4. 遍历e,a[s[3]-'a']=0,则a[s[3]-'a']=1,计数器;k+1=2,max=2

  5. 遍历k,a[s[4]-'a']=0,则a[s[4]-'a']=1,计数器;k+1=3;max=3;

  6. 遍历w,因a[s[5]-'a']=1,故从此数开始遍历,则a[s[5]-'a']=1,计数器;k+1=1,max=3;

  7. 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;
}

 结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值