zoukankan      html  css  js  c++  java
  • 剑指 Offer 48. 最长不含重复字符的子字符串 哈希双指针

    地址 https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/

    请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
    
    示例 1:
    输入: "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    
    示例 2:
    输入: "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
    
    示例 3:
    输入: "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
         请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
     
    
    提示:
    s.length <= 40000
    注意:本题与主站 3 题相同:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

    题解 

    使用双指针指示子字符串 利用哈希表记录范围内的字符串
    当无重复字符的时候就从右端扩展字符串的范围
    当有重复字符的时候就从左端缩小字符串的范围
    这里是用数组代替哈希表的使用,速度会更快一些

    class Solution {
    public:
        int mm[300];
        int lengthOfLongestSubstring(string s) {
            int l = 0; int r = 0; int ans = 0;
            while (l < s.size() && r < s.size()) {
                while (r < s.size() && mm[s[r]-0] < 1) { mm[s[r]-0]++; r++; }
                ans = max(ans, r - l);
                while (l < s.size() && r < s.size() && mm[s[r]-0] >0) { mm[s[l]-0]--; l++; }
            }
    
            return ans;
        }
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    swoole推送信息一对一,一对多
    laravel5.8笔记十:Redis操作
    laravel5.8笔记九:数据库曾、更、查、删
    laravel5.8笔记八:数据库(单库和多库)
    laravel5.8笔记七:语言包
    laravel5.8笔记六:公共函数和常量设置
    laravel5.8笔记五:基类控制器和基类模型
    laravel5.8笔记四:中间件
    laravel5.8笔记四:路由
    微软开源自动机器学习工具NNI安装与使用
  • 原文地址:https://www.cnblogs.com/itdef/p/14448828.html
Copyright © 2011-2022 走看看