一、题目
二、解题思路
(1)思路一
定义一个长度为给定字符串长度一样的数组,全部初始化为’\0’,这是由于leecode给定的测试用例中包含26个大小写字母,数字,各种符号及空格。在定义一个临时变量x来存放字符串长度,进行举例:
例如:字符串为:a,b,c,a,b,c,b,b
1、遍历字符串取出元素a,由于数组中时空的,将a放入其中。将元素存入到数组中,计数器x加一。
2、遍历字符串取出元素b,让b与数组中的每个元素进行比较,发现a不等于b,将b存入到数组中,计数器x加一。
3、遍历字符串取出元素c,让b与数组中的每个元素进行比较,发现c不等于a,也不等于b,将c存入到数组中,计数器x加一。
4、遍历字符串取出元素a,让a与数组中的每个元素进行比较,发现a等于a,说明有重复值,计数器清零,重新计算下一个字符串的长度,再把数组清空,方便下一次的字符比较,后面的b,c,b,b也以此类推。
(2)思路二
定义变量top来记录首位置0,end来记录末位置1,进行举例:
例如:字符串为:a,b,c,a,b,c,b,b
1、a和b比较,不相等。
2、end后移到c,a和c比较,不相等,再用b和c比较,不相等。
3、end后移到a,a和a比较,相等,记录字符串最大值3。
4、top加一变为1,对应的值为b,end加一变为2,对应的值为c,字符串变为b,c,a,b,c,b,b。
5、b和c比较,不相等。
6、end后移到a,b和a比较,不相等,再用c和a比较,不相等。
7、end后移到b,b和b比较,相等,记录字符串最大值3。
8、top加一变为2,对应的值为c,end加一变为3,对应的值为a,字符串变为c,a,b,c,b,b,依次类推得出最终结果。
三、虚机测试代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char flg = '\0';
void main()
{
int lengthOfLongestSubstring(char * s);
int lengthOfLongestSubstring_v0(char * s);
char str[] = "a";
//char str[] = "bcdABCD1234bcdABCD1234bcdABCD1234bcdABCD1234bcdABCD1234bcdABCD1234";
//char str[] = "abcabcbb";
//char str[] = "pwwkew";
//char str[] = "dvdf";
//char str[] = "hijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789hijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789hijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789hijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789hijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789hijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
printf("result_v0 : %d\n",lengthOfLongestSubstring(str));
printf("result_v1 : %d\n",lengthOfLongestSubstring_v0(str));
}
int lengthOfLongestSubstring_v0(char * s)
{
int size = strlen(s);
if(size == 0)
{
return 0;
}
else if(size == 1)
{
return 1;
}
int maxval = 0;
int top;
int end;
int tmp = 0;
for(top=0; top<size-1; top++)
{
for(end=top+1; end<size; end++)
{
//printf("s[%d] : %c, s[%d] : %c\n",top,s[top],end,s[end]);
tmp = top;
while(tmp < end)
{
//printf("s[top] : %c, s[end] : %c\n",s[tmp],s[end]);
if(s[tmp] == s[end])
{
break;
}
tmp++;
}
if(tmp != end)
{
break;
}
}
//printf("top : %d, end : %d\n",top,end);
//printf("===================\n");
if(maxval < end - top)
{
maxval = end - top;
}
}
return maxval;
}
int lengthOfLongestSubstring(char * s)
{
void InitStr(char *str, int size);
void PrintfArr(void *arr, int size ,int elementsize);
int strsize = strlen(s);
int i,j,x;
char *tmparr = malloc(sizeof(char) * strsize);
int z = 0;
int max = 0;
if(strsize == 0)
{
return 0;
}
//j
for(i=0; i<strsize; i++)
{
tmparr[i] = flg;
}
for(i=0,x=0; i<strsize; i++)
{
for(j=0; tmparr[j] != flg; j++)
{
if(s[i] == tmparr[j])
{
x = 0;
InitStr(tmparr, strsize);
j = 0;
i = ++z;
break;
}
}
x++;
if(max < x)
{
max = x;
}
tmparr[j] = s[i];
//printf("max : %d\n",max);
//PrintfArr(tmparr, strsize , sizeof(char));
//printf("==================\n");
}
return max;
}
void PrintfArr(void *arr, int size ,int elementsize)
{
if(elementsize == sizeof(int))
{
int *tmparr = (int*)arr;
int i;
for(i=0; i<size; i++)
{
printf("%d ",tmparr[i]);
}
}
else if(elementsize == sizeof(char))
{
char *tmparr = (char*)arr;
int i;
for(i=0; i<size; i++)
{
printf("%c ",tmparr[i]);
}
}
printf("\n");
}
void InitStr(char *str, int size)
{
int i;
for(i=0; (i < size) && (str[i] != flg); i++)
{
str[i] = flg;
}
}
四、虚机测试截图
五、leecode提交代码
(1)代码一
char flg = '\0';
int lengthOfLongestSubstring(char * s)
{
void InitStr(char *str, int size);
int strsize = strlen(s);
int i,j,x;
char *tmparr = malloc(sizeof(char) * strsize);
int z = 0;
int max = 0;
if(strsize == 0)
{
return 0;
}
for(i=0; i<strsize; i++)
{
tmparr[i] = flg;
}
for(i=0,x=0; i<strsize; i++)
{
for(j=0; tmparr[j] != flg; j++)
{
if(s[i] == tmparr[j])
{
x = 0;
InitStr(tmparr, strsize);
j = 0;
i = ++z;
break;
}
}
x++;
if(max < x)
{
max = x;
}
tmparr[j] = s[i];
}
return max;
}
void InitStr(char *str, int size)
{
int i;
for(i=0; (i < size) && (str[i] != flg); i++)
{
str[i] = flg;
}
}
(2)代码二
int lengthOfLongestSubstring(char * s)
{
int size = strlen(s);
if(size == 0)
{
return 0;
}
else if(size == 1)
{
return 1;
}
int maxval = 0;
int top;
int end;
int tmp = 0;
for(top=0; top<size-1; top++)
{
for(end=top+1; end<size; end++)
{
tmp = top;
while(tmp < end)
{
if(s[tmp] == s[end])
{
break;
}
tmp++;
}
if(tmp != end)
{
break;
}
}
if(maxval < end - top)
{
maxval = end - top;
}
}
return maxval;
}
六、leecode提交截图