LeetCode - 3. 无重复字符的最长子串——哈希表、双指针、滑动窗口法、字符串_yours_棒棒糖的博客-程序员宅基地

技术标签: # LeetCode  

3. 无重复字符的最长子串

题目描述

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:

输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:

输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
示例 4:

输入: s = “”
输出: 0

解题思路

    /**
     * 我自己写的题解,感觉有点像暴力递归,没错,就是暴力
     * 当出现了重复的字符时,需要对一开始出现重复的字符的位置进行判断,而不是直接break,这样会增大复杂度
     * @param s
     * @return
     */
    public int lengthOfLongestSubstring_1(String s) {
    
        if (s.length() == 0){
    
            return 0;
        }

        int max = 0;
        for (int i = 0; i < s.length(); i++) {
    
            HashSet<Character> temp = new HashSet<>();
            for (int j = i; j < s.length(); j++) {
    
                if (temp.contains(s.charAt(j))){
        //这里只是简单的判断是否重复,并对i进行加一,应该判断出现重复的字符的位置,因为set是无序的,则需要使用map进行存储
                    //判断如果包含了,则直接跳出
                    break;

                }
                temp.add(s.charAt(j));
            }
            System.out.println(temp);
            //遍历出现的temp的长度中的最大值
            max = Math.max(max,temp.size());
        }
        return max;
    }

    /**
     * 力扣给出的官方题解
     * @param s
     * @return
     */

    public int lengthOfLongestSubstring_2(String s) {
    
        //哈希集合,记录每个字符是否出现过
        Set<Character> temp = new HashSet<>();
        int n = s.length();
        //右指针,初始值为-1,相当于在字符串的左边界的左侧,还么有开始移动
        int rk = -1,ans = 0;
        for (int i = 0; i < n; i++) {
    
            if (i != 0){
    
                //左指针向右移动一格,移除一个字符
                temp.remove(s.charAt(i - 1));
//                System.out.println(temp);
            }
            while (rk + 1 < n && !temp.contains(s.charAt(rk +1))){
    
                //不断移动右指针
                temp.add(s.charAt(rk + 1));
                System.out.println(temp);
                rk ++;
            }
            //第i到rk个字符是一个极长的无重复字符子串
            ans = Math.max(ans,rk - i + 1);
        }
        return ans;
    }

少了一个循环,把重复的数字的下标记住,下次从下标开始记循环,就少了很多遍历

   public int lengthOfLongestSubstring_3(String s) {
    
        int n = s.length(),ans = 0;
        Map<Character,Integer> map = new HashMap<>();
        for(int end = 0,start = 0;end < n;end ++){
    
            char temp = s.charAt(end);
            if (map.containsKey(temp)){
    
                start = Math.max(map.get(temp),start);
            }
            ans = Math.max(ans,end - start + 1);
            map.put(s.charAt(end),end + 1);
        }
        return ans;
    }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_35655602/article/details/114376040

智能推荐

C/C++ 库函数 二分查找 bsearch_cedricporter的博客-程序员宅基地

void * bsearch ( const void * key, const void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );其

RFC 2866 Radius Accounting 中文版本_twingao的博客-程序员宅基地

这个是RADIUS计费协议,也是好几年前花了很多个晚上翻译的,花了两个晚上进行了完善,上传共享。Network Working Group C. RigneyRequest for Comments: 2866

【译】Android位图颜色模式的问题_无为_的博客-程序员宅基地

最近开始了android上的编程之旅,在了解2D图形编程时,令人蛋疼的发觉android上仅支持ARGB8888、ARGB4444、RGB565以及Alpha 8这么几种颜色模式,而不支持RGB888这种格式。原本以为即使不支持RGB888我用ARGB8888总行吧,但后来了解到,即使我在内存中用ARGB888颜色模型表示图像,在该图像拷贝到屏幕帧缓冲区的过程中,它也会变成RGB565颜色模式。我

到开源包时遇到了错误 error: duplicate value for resource 'attr/hintColor' with config ''._the_old_boy的博客-程序员宅基地

情景:在GitHub上找到了一个符合自己要求的开源项目,兴致冲冲的新建了一个测试项目导进去,成功了,没有错误,于是开始导入自己真正的项目中,结果报错了。一脸惊奇!!想想应该是和我项目的那些地方冲突了。仔细分析后发现果真错误如下:error: duplicate value for resource 'attr/hintColor' with config ''.Message{kind=...

把SQLAlchemy查询对象转换成字典-程序员宅基地

1-假设查出来的为单个对象1-1 在model.py中为模型对象添加字典转换函数:from exts import dbclass User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) use..._sqlalchemy cannot convert dictionary

Jboss调优——最佳线程数_jboss查看线程数_lengyuhong的博客-程序员宅基地

在设置jboss的参数中,maxThreads(最大线程数)和acceptCount(最大等待线程数)是两个非常重要的指标,直接影响到程序的QPS。本文讲解jboss连接的运行原理,以及如何设置这两个参数。_jboss查看线程数

随便推点

医院护理问题_数据流程图 目前住院病人主要由护士护理,这样做不仅需要大量护士_##chen的博客-程序员宅基地

目前住院病人主要由护士护理,这样做不仅需要大量护士,而且由于不能随时观察危重病人的病情变化,还可能会延误抢救时机。某医院打算开发一个以计算机为中心的患者监护系统,试写出问题定义,并且分析开发这个系统的可行性。答:(1)问题定义①本系统的数据源点是“病人”和“护士”,他们分别提供生理信号和要求的病情报告相关信息。从系统应该“定时记录病人情况以形成患者日志”这项要求可以想到,还应该有一个提供日期和时间信息的“时钟”作为数据源点。②本系统的数据终点是接收警告信息和病情报告的护士。系统对病人生理信号的处理功能_数据流程图 目前住院病人主要由护士护理,这样做不仅需要大量护士

组合数,阶乘求法_组合 阶乘_sykai1的博客-程序员宅基地

复杂度:O(n^2)C[i][j]即为C(i,j);#include &lt;bits/stdc++.h&gt;using namespace std;const int MOD = 1e9+7;const int maxn = 1e3;typedef long long ll;int n,k;ll C[maxn][maxn];int main(){ n = 1..._组合 阶乘

正在连接192.168.56.101...无法打开到主机的连接。 在端口 1521: 连接失败_CBX_0327的博客-程序员宅基地

我是在VirtualBox上的虚拟机安装了oralce,然后想在主机上面连接oralce,发现连接不上。我的虚拟机采用双网卡模式,一个是桥接模式,一个是Host-Only模式。采用桥接模式是为了可以与访问网上的资源,但为啥要设置双网卡呢。因为桥接模式的IP所在的局域网不一样的话,ip也会随着改变的。我想要一个固定的虚拟机的ip,同时又想访问网上的资源,所以采用了双网卡的模式。关于VirtualBox虚拟机的网络设置,可以参考一下文章:VirtualBox虚拟机网络设置(四种方式)下面是我...

解决OSError: [WinError 127] Error loading “S:\anaconda\envs\bert\lib\site-packages\torch\lib\caffe2_de-程序员宅基地

OSError: [WinError 127] 找不到指定的模块。anaconda\lib\site-packages\torch\lib\caffe2_detectron_ops.dll“FileNotFoundError - caffe2_detectron_ops.dll on Windows source build if Python 3.8 used · Issue #35803 · pytorch/pytorch · GitHub删掉caffe2_detectron_ops.dll..

《java基础》——IO流(输入输出)_java中io流输入流什么方法给程序提供了一个从输入流中读取数据的基本方法_创求进的博客-程序员宅基地

输入输出的重要性: 输入和输出功能是Java对程序处理数据能力的提高,Java以流的形式处理数据。流是一组有序的数据序列,根据操作的类型,分为输入流和输出流。 程序从输入流读取数据,向输出流写入数据。Java是面向对象的程序语言,每一个数据流都是一个对象,它们提供了各种支持“读入”与“写入”操作的流类。Java的输入输出功能来自java.io 包中的InputStream类、OutputSt..._java中io流输入流什么方法给程序提供了一个从输入流中读取数据的基本方法

14:求10000以内n的阶乘-程序员宅基地

描述求10000以内n的阶乘。输入只有一行输入,整数n(0<=n<=10000)。输出一行,即n!的值。样例输入100样例输出933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208..._求10000以内n的阶乘