#include<stdio.h>
#include<string.h>
int length(char*s);
int main()
{
char arr[30];
gets(arr);
printf("length=%d",length(arr));
return 0;
}
/*
int length(char *s)
{
int left=0,right=0;
int sizemax=0,size=0;
int map[129]={0};
for(left=0;left<strlen(s);left++)
{
right=left;
while(map[s[right]]==0&&s[right]!='\0')
{
map[s[right]]++;
right++;
}
size=right-left;
if (size>sizemax)
{
sizemax=size;
size=0;
}
for(int i=0;i<=129;i++)
{
map[i]=0;
}
}
return sizemax;
}
*/
//上方法是基础解法
int length(char*s)
{
int maxlen=0,size=0;
int left=0,right=0;
int map[128]={'0'};
while (s[right]!='\0')
{
if (map[s[right]]!=0)
{
if(left<map[s[right]])
{
size=right-left;
if(maxlen<size)maxlen=size;
left=map[s[right]];
}/*map用来记每个右边界移动到的元素的位置
如ABCABCDEF如果right移动到第一个B,则位置是2
当遇到第二个A是,则开始移动左边界到A上,再继续
移动右边界,当移动到第二个B时,进入判断,判断发现
map中记录的B的位置在现在的left之前,说明在新的子串中
B并没有重复。 */
}
map[s[right]]=right+1;
right++;
}
size=right-left;
if(maxlen<size)maxlen=size;
return maxlen;
}
//方法2 移动窗口法
11-24
160
02-07
1271
10-22
3711