zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    计算公式以及参数数量计算
    sqlmap查找SQL注入漏洞入门
    动态密码卡TOTP算法
    使用windbg分析iis崩溃的一个实例
    windbg加载sos.dll
    wndbg下载与安装
    windbg入门
    IIS崩溃时自动抓取Dump
    net组件转化成COM组件
    dokuwiki安装部署
  • 原文地址:https://www.cnblogs.com/chenrj97/p/14280977.html
Copyright © 2011-2022 走看看