• Medium | LeetCode 3 | 剑指 Offer 48. 最长不含重复字符的子字符串


    剑指 Offer 48. 最长不含重复字符的子字符串

    请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

    示例 1:

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

    示例 2:

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

    示例 3:

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

    方法一:

    从左往右遍历, 遍历时, 将此字符的下标保存下来。这样在遍历的过程中, 我们就能知道当前字符上一次出现是在什么位置。同时维持一个left值保存当前不含重复字符的子串的左边界。如果当前字符上一次出现的位置在left的右边, 则需要更新left的值, 以及计算当前的子串的长度以便更新最大的长度值。

    public int lengthOfLongestSubstring(String s) {
        if(s.length() == 0) {
            return 0;
        }
        if(s.length() == 1) {
            return 1;
        }
        // map 用来保存当前字符上一次出现的位置
        Map<Character, Integer> map = new HashMap<>(26);
        int left = 0, res = 0;
        int i;
        for (i = 0; i < s.length(); i++) {
            // 假如当前字符上一次出现过, 并且在left边界的右边, 那么需要更新left的值, 以及更新长度
            if(map.containsKey(s.charAt(i)) && map.get(s.charAt(i)) >= left) {
                res = Math.max(i - left, res);
                left = map.get(s.charAt(i)) + 1;
            }
            // 每次遍历都需要把当前字符的下标值保存下来, 并覆盖之前的值
            map.put(s.charAt(i), i);
        }
        // 因为前面for循环可能最后正常遍历结果, 没有遇到需要更新left的情况, 所以需要在最后做一个更新
        res = Math.max(i - left, res);
        return res;
    }
    
  • 相关阅读:
    nvm的安装与使用
    webpack中import动态设置webpackChunkName方法
    css在背景图下加渐变色
    js实现时间戳转换
    js实现随机数和随机数组
    js实现导航自动切换请求数据
    jq、js获取select中option上的value值以及文本值
    js、jq实现select 下拉选择更多
    软件测试
    php
  • 原文地址:https://www.cnblogs.com/chenrj97/p/14280977.html
Copyright © 2020-2023  润新知