3,无重复字符的最长子串 — LeetCode系列篇

题目:

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

示例 1:

输入: “abcabcbb”

输出: 3

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

示例 2:

输入: “bbbbb”

输出: 1

解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:

输入: “pwwkew”

输出: 3

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

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

答案(java版):

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        int res = 0, left = 0, right = 0;
        HashSet<Character> hashSet = new HashSet<>();
        while (right < s.length()) {
            if (!hashSet.contains(s.charAt(right))) {
                hashSet.add(s.charAt(right++));
                res = Math.max(res, hashSet.size());
            } else {
                hashSet.remove(s.charAt(left++));
            }
        }
        return res;
    }
}

分析:

这道题给了我们一个字符串,求最长的无重复字符的子串,注意这里是子串,不是子序列,所以必须是连续的。这道题类似于第一篇:求两数之和。

解题思路如下:

1,记录之前出现过的字符,记录的方式有很多,选用HashSet是因为Set不保存重复元素,并且查询速度比较快;

2,定义一个滑动窗口,滑动窗口不断右移,并且里面没有重复字符,需要定义一个left变量指向窗口的第一个字符,一个right变量指向当前字符;

3,HashSet中和当前遍历元素重复的元素可能在中间,也可能在两端,需要移动left直到剔除重复元素;

4,定义一个变量res保存最大子串长度,HashSet每次增加一个新元素存储大小都会变化,可能比res大,也可能比res小(剔除过重复元素),所以每次都需要和res比较取最大值。

LeetCode执行结果:通过

执行用时 :13 ms, 在所有 Java 提交中击败了52.45%的用户

内存消耗 :36.5 MB, 在所有 Java 提交中击败了97.35%的用户

发布了48 篇原创文章 · 获赞 27 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_41480546/article/details/103847913