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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    Java算法之 二分搜寻法 ( 搜寻原则的代表)
    Java算法之 二分搜寻法 ( 搜寻原则的代表)
    基本选择器示例 改变颜色
    jquery 2.3.1 基本选择器
    ModelMapper:从对象到对象的映射库
    老司机带你在MySQL领域“大吉大利,晚上吃鸡”
    jquery getElementById
    jquery getElementsByName
    根据id获取元素
    win10能点开开始菜单但是不能点里面的功能
  • 原文地址:https://www.cnblogs.com/itdef/p/14448828.html
Copyright © 2011-2022 走看看