画解算法:3. 无重复字符的最长子串

题目连接

leetcode-cn.com/problems/lo…java

题目描述

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

示例 1:bash

输入: "abcabcbb"
输出: 3 
解释: 由于无重复字符的最长子串是 "abc",因此其长度为 3。
复制代码

示例 2:数据结构

输入: "bbbbb"
输出: 1
解释: 由于无重复字符的最长子串是 "b",因此其长度为 1。
复制代码

示例 3:spa

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

解题方案

思路

  • 标签:滑动窗口
  • 暴力解法时间复杂度较高,会达到O(n^2),故而采起滑动窗口的方法下降时间复杂度
  • 定义一个map数据结构存储(k,v),其中key值为字符,value值为字符位置+1,加1表示从字符位置后一个才开始不重复
  • 咱们定义不重复子串的开始位置为start,结束位置为end
  • 随着end不断遍历向后,会遇到与[start, end]区间内字符相同的状况,此时将字符做为key值,获取其value值,并更新start,此时[start, end]区间内不存在重复字符
  • 不管是否更新start,都会更新其map数据结构和结果ans。
  • 时间复杂度:O(n)

代码

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length(), ans = 0;
        Map<Character, Integer> map = new HashMap<>();
        for (int end = 0, start = 0; end < n; end++) {
            char alpha = s.charAt(end);
            if (map.containsKey(alpha)) {
                start = Math.max(map.get(alpha), start);
            }
            ans = Math.max(ans, end - start + 1);
            map.put(s.charAt(end), end + 1);
        }
        return ans;
    }
}
复制代码

画解

fr<x>ame_00001.png
fr<x>ame_00002.png
fr<x>ame_00003.png
fr<x>ame_00004.png
fr<x>ame_00005.png
fr<x>ame_00006.png
fr<x>ame_00007.png
fr<x>ame_00008.png

后台回复「算法」,加入每天算法群 以为算法直击灵魂,欢迎点击在看转发3d

相关文章
相关标签/搜索