leecode-C语言实现-3. 无重复字符的最长子串

一、题目
在这里插入图片描述
在这里插入图片描述

二、解题思路
(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提交截图
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值