找到字符串的最长无重复字符子串-腾讯/百度/字节跳动笔试编程C/C++

(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat

题目描述:

给定一个数组arr,返回arr最长的无重复子串的长度(无重复指的是所有数字都不相同)。(arr的长度为n,1≤n≤10^5)

(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat

输入:[2,2,3,4,3]

输出:3

(这是牛客网提供的一道题目,想尝试的码友们,可以通过这个链接挑战https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4?tpId=117&tqId=37816&tab=answerKey

分析

初看👓这道题,我以为动态规划,然后,就5分钟一通规划,最后… …超时😰

后来,断断续续纠结了10,最终用双指针通过了此题!

 

双指针

双指针就是一前一后两个指针(指针i 指针j),两个指针指向一个数组(数组arr),且使两个指针中间的那段数组中元素无重复

 

解题思想:

接下来,我们就运用双指针来解决这个题目~

初始--指针i 指针j数组arr

  i =0,指向arr的第1个元素;j=0,指向arr的第2个元素;

(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat

如果指针i 指针j中间的那段数组中元素无重复,就让指针j后移一位;

如果指针i 指针j中间的那段数组中元素重复,就让指针i后移至无重复,然后让指针j后移一位;

在这个过程中,指针i 指针j中间含有的最多元素个数,就是所求值

 

补充:用map判断是否有重复元素

解这道题目的时候,又重新复习了一遍map,好久不用,基本忘记了

定义: map是一个关联容器,它提供一对一的hash。

第一个数,称为关键字(key),每个关键字只能在map中出现一次

第二个数,称为该关键字的值(value);

三个用到的函数

count()         返回指定元素出现的次数(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat

erase()          删除一个元素

size()           返回map中元素的个数

C++代码

class Solution {

public:

    /**

     *

     * @param arr int整型vector the array

     * @return int整型

     */

    int maxLength(vector<int>& arr) {

        int i, j, num;

        num = 0;/*记录无重复最长子串的长度*/

        if(arr.size() > 0)

        {

            map<int, int> bmap;/*用map判断是否有重复元素*/

            i = 0;

            bmap[arr[i]] = i;/*(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat)*/

            num = bmap.size();

            if(arr.size() > 1)

            {

                j = 1;

                while((i <= j)&&(j < arr.size()))

                {

                    if(bmap.count(arr[j]))

                    {

                        while(arr[i] != arr[j])

                        {

                            bmap.erase(arr[i]);

                            i++;

                        }

                        i++;

                    }

                    bmap[arr[j]] = j;

                    if(bmap.size() > num)/*(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat)*/

                    {

                        num = bmap.size();

                    }

                    j++;

                }

            }          

        }

        return num;

    }

};

每次无论是种植花,还是剪插鲜花,都会给生活带来很多希望和欣喜~--2021年4月23日

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值