• 剑指 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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    [高精度模板][Pascal]整数加、减、乘、除、开方等
    [poj2528]求最后未完全被其它线段覆盖的线段个数
    [POJ3468]线段树模板
    火车进出栈问题(强化版)
    手把手教上Getchu.com
    集合删数
    [SBT模板题]HNOI2002 营业额统计
    离散化Pascal模板
    hdu 4507 吉哥系列故事——恨7不成妻
    组合数学总结
  • 原文地址:https://www.cnblogs.com/itdef/p/14448828.html
Copyright © 2020-2023  润新知