leetcode第3题:无重复字符的最长子串

        这道题需要判断子串的长度那就一定得找到子串的头和子串的尾,然后尾和头的差值就是长度,那就需要一个头指针一个尾指针,尾指针遍历数组每个字符的同时去查询头指针到尾指针这里是否有重复的字符,咋一看跟第1题有点像。

        第1题通过每次将遍历的字符塞进哈希表来达到只遍历一次的效果,那这里也能用类似的办法,遍历的同时将字符塞进哈希表,这里比第一题方便的原因是这里是字符串,那字符串只有0~128种可能,那声明一个128个元素的数组就行了,代码如下:

int lengthOfLongestSubstring(char *s)
{
    int head = 0;
    int tail = 0;
    int max_len = 0;
    char hash_map[128] = {0};

    while (s[tail])
    {
        // 表里是否存在重复元素
        if (hash_map[s[tail]])
        {
            if (tail - head > max_len)
            {
                max_len = tail - head;
            }

            while (head < tail)
            {
                if (s[head] == s[tail])
                {
                    head++;
                    break;
                }
                hash_map[s[head]] = 0;
                head++;
            }
        }
        hash_map[s[tail]] = 1;
        tail++;
    }
    if (tail - head > max_len)
    {
        max_len = tail - head;
    }

    return max_len;
}

在leetcode上自己做题然后看看别人的想法确实偶尔有收获。

leetcode上面的解决方法有的实在没法理解的话不强求,适合自己但是又能比普通解法好一点的才是最好的(个人理解)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值