题目地址(3. 无重复字符的最长子串)

https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

题目描述

  1. 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
  2. 示例 1:
  3. 输入: s = "abcabcbb"
  4. 输出: 3
  5. 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3
  6. 示例 2:
  7. 输入: s = "bbbbb"
  8. 输出: 1
  9. 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1
  10. 示例 3:
  11. 输入: s = "pwwkew"
  12. 输出: 3
  13. 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3
  14. 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
  15. 示例 4:
  16. 输入: s = ""
  17. 输出: 0
  18. 提示:
  19. 0 <= s.length <= 5 * 104
  20. s 由英文字母、数字、符号和空格组成

前置知识


公司

  • 暂无

思路

image.png
滑动窗口 遇到相同的字符就把i从之前相同的的下一个开始

关键点


代码

  • 语言支持:Java

Java Code:

  1. class Solution {
  2. public int lengthOfLongestSubstring(String s) {
  3. //128是因为一会要是用ASCII码 z是一百二十多
  4. int[] ints = new int[128];
  5. //返回值
  6. int res = 0;
  7. for (int left = 0, right = 0; right < s.length(); right++) {
  8. //左指针为当前值 还是 在ints里s对应的字符位置的数字
  9. //取决于数组这个位置是否有数字 也就是有没有重复的字符
  10. //如果有重复的字符 因为记录的是下个字符的下标 就让left=之前重复的下一个字符
  11. left = Math.max(ints[s.charAt(right)], left);
  12. //记录最大的数组的长度 如果只有一个字符长度为1
  13. res = Math.max(res, right - left + 1);
  14. //记录当前字符的下一个字符的下标
  15. ints[s.charAt(right)] = right+1;
  16. }
  17. return res;
  18. }
  19. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:3. 无重复字符的最长子串 - 图2#card=math&code=O%28n%29&id=J3Q9x)
  • 空间复杂度:3. 无重复字符的最长子串 - 图3#card=math&code=O%28n%29&id=Zkhp6)