计蒜客 最长不重复子串问题

问题描述:

给定一个字符串,找到最长的子串,要求该子串中没有重复的字符。

例如:

字符串abcabcbb的不含重复字符的 最长 子串为abc,长度为 3。

而bbbbbb的不含重复字符的 最长 子串为b,长度为 1。

输入格式

输入包含多行,每一行对应一个长度不超过 100 的输出,直到遇到结束符为止。每行依次输入字符串s。

输出格式

输出不含重复字符的 最长 子串的长度。

样例输入

hchzvfrkmlnozjk

样例输出

11

C++语言代码:

#include <cstring>
#include <iostream>
using namespace std;
int main()
{
    char a[1000];
    int b[1000];
    while(cin>>a)
    {
        int len=strlen(a);  //计算字符数组的长度利用strlen()时需要加上头文件<cstring>
        int i,j;
        int max=1;
        for(i=0;i<len;i++)
        {
            int z=0;//每当重新进行扫描时,都要将计数变量z清零,用于重新计数
            memset(b,0,sizeof(b));//memset(b,0,sizeof(b))函数是将数组a中的所有元素都初始化为0
            for(j=i;j<=len;j++)
            {
                int x=a[j];//将输入到char a数组中的第一个字符所对应的ASCII的值赋给变量x
                b[x]++;//将变量对应的ASCII值当做数组a的下标,每个下标对应的值都是在memset函数中初始为了0
                if(max<z) max=z;//用来进行计数的变量
                if(b[x]>1) { break;}//当同一个下标对应的数组值大于1时,就说明遇到有重复的字符出现,此时退出循环,重新开始计数。
                z++;
            }
        }
        cout<<max<<endl;
    }
}

C语言代码

#include<stdio.h>  
#include<string.h>   
char a[125];  
int b[125];  
int main()  
{  
    while(scanf("%s",a)!=EOF)  
    {  
        int len=strlen(a);  
        int i,j;  
        int max=-1;  
        for(i=0;i<len;i++)  
        {      
            memset(b,0,sizeof(b));  
            b[a[i]-'0']=1;  
            for(j=i+1;j<len;j++)  
            {  
               if(b[a[j]-'0']==0)  
                {  
                  b[a[j]-'0']=1;   
                }  
               else  
                break;  
            }  
            if(max<j-i)  
            max=j-i;  
        }  
        printf("%d\n",max);   
    }     
}  

猜你喜欢

转载自blog.csdn.net/m0_37592397/article/details/79748271