题目链接

LeetCode

题目描述

给定一个字符串 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 由英文字母、数字、符号和空格组成

    解题思路

    方法一:双指针+哈希

    利用哈希表记录每个字母的最后一次出现位置

    1. class Solution {
    2. public int lengthOfLongestSubstring(String s) {
    3. Map<Character, Integer> map = new HashMap<>();
    4. int res = 0, left = 0;
    5. for(int i = 0; i < s.length(); ++i){
    6. if(map.containsKey(s.charAt(i))){
    7. left = Math.max(left, map.get(s.charAt(i)) + 1);
    8. }
    9. map.put(s.charAt(i), i);
    10. res = Math.max(res, i - left + 1);
    11. }
    12. return res;
    13. }
    14. }
  • 时间复杂度 O(n)

  • 空间复杂度 O(n)