无重复字符的最长子串

135 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

无重复字符的最长子串

题目

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

示例 1:

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

示例 2:

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

示例 3:

输入: s = "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

请注意,你的答案必须是 子串 的长度,"pwke" 是一个_子序列,_不是子串。

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

Related Topics

  • 哈希表
  • 字符串
  • 滑动窗口

题目分析

通过Related Topics的关键词,我们知道这道题目考察的是滑动窗口的算法知识,

代码实现

这是代码的实现:

import java.util.HashMap;

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s.length() == 0) {
            return 0;
        }
        HashMap<Character, Integer> hashMap = new HashMap<>();
        int maxLength = 0;
        int left =0;
        for (int i=0;i<s.length();i++) {
            if (hashMap.containsKey(s.charAt(i))) {
                left = Math.max(left,hashMap.get(s.charAt(i))+1);

            }
            hashMap.put(s.charAt(i),i);
            maxLength = Math.max(maxLength,i-left+1);
        }
        return maxLength;
    }
}

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉滑动窗口的使用和操作。

这道题的思路就是利用滑动窗口,遍历一次就能求出无重复字符的最长子串的长度,具体思路就是使用两个指针,左指针表示子串的起始位置,右指针不断右移,直到出现重复的字符,这时候的子串就是我们想要的无重复字符的长子串,然后左指针再跳到右指针的下一个位置,右指针再不断扩大,直到遍历到尾部,这样一次遍历下来求得的所有子串的最长子串的长度就是我们想要的结果

小知识

java程序经过编译器编译后生成字节码,而字节码通过jvm解释执行,jvm后将字节码给解释器,解释器会将字节码变成二进制机器码,这样就可以在机器上运行了,通过字节码可以实现一次编译到处运行的效果,实现了跨平台。

总结

本篇文章主要解决了无重复字符的最长子串的问题,思路就是使用滑动窗口来解决,然后简单说了一下java生成的字节码为什么能一次编译到处运行,实现了跨平台,对于滑动窗口的问题感兴趣的小伙伴们可以找其他算法题尝试解决,实现一下吧,嘿嘿,多动脑,勤思考。