LeetCode-day3-无重复字符的最长子串(中等)

问题描述

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

示例

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

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

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

题解

思路

  • 定义hash表用于存储已经遍历过的字节和字节对应的最大下标
  • 每次遍历 判断当前字节是否已经存在,存在则获取将最大长度和当前长度中的最大值置为最大长度,修改当前长度为当前长度到当前字节上一次出现的位置的长度;否则当前长度+1
  • 遍历结束返回最大长度和当前长度中的最大值
public static int lengthOfLongestSubstring(String s) {
    if (s == null || s.length() == 0) {
        return 0;
    }
    // 将字符串转为字节数组
    char[] chars = s.toCharArray();
    // 定义最大长度和当前无重复的长度
    int  currentLength = 1, maxLength = 1;
    // hash表用于存储已经遍历过的字节和字节对应的最大下标
    HashMap<Character, Integer> map = new HashMap<>();
    map.put(chars[0], 0);

    for (int i = 1; i < chars.length; i++) {
        // 判断当前字节是否已经存在
        if (map.containsKey(chars[i])) {
            // 存在则获取将最大长度和当前长度中的最大值置为最大长度
            maxLength = Math.max(currentLength, maxLength);
            Integer index = map.get(chars[i]);
            // 修改当前长度为当前长度到当前字节上一次出现的位置的长度
            currentLength = i - index;
        } else {
            // 不存在,当前长度+1
            currentLength++;
        }
        map.put(chars[i], i);
    }
    // 返回最大长度和当前长度中的最大值
    return Math.max(maxLength, currentLength);
}
  • 时间复杂度 O(n)
  • 空间复杂度 O(n)

LeetCode题目地址

posted @ 2020-05-15 11:54  丢了蜡笔的小鑫  阅读(99)  评论(0)    收藏  举报

载入天数...载入时分秒...