zoukankan      html  css  js  c++  java
  • 无重复字符的最长子串[双指针+哈希表] LeetCode.3

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

    示例 1:

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

    示例 2:

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

    示例 3:

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

    思路:

    • 双指针 l r 从左到右扫描字符串;
    • hash表中存储双指针范围内的字符;
    • r指针逐步向右扩展,每到达新的一位询问hash表是否存在该字符;
    • 如果不存在则将该字母在hash表中标记;
    • 如果存在则将 l 指针向右移动,更新hash表;
    • 逐步缩减双指针区域,在过程中更新ans;

    代码如下:

    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            int l, r, ans = 0;
            unordered_map<int,int>hash;
            for(r = l = 0 ; r < s.size();r++){
                if(hash[s[r]]){
                    for(;l < r && hash[s[r]];l++){
                        hash[s[l]]--;
                    }
                }
                hash[s[r]] ++;
                ans = max(r - l + 1 , ans);
            }
            return ans;
        }
    };
    
  • 相关阅读:
    再谈Dilworth定理
    区间动态规划
    单调队列优化动态规划
    暑假集训考试R2 konomi 慕
    NOIP 2000 计算器的改良
    2007 Simulation message
    COCI 2003 LIFTOVI 电梯 SPFA
    NOIP 2003 数字游戏
    USACO 2014 DEC Guard Mark 状态压缩
    使用HttpClient发送GET请求
  • 原文地址:https://www.cnblogs.com/zhangxiaomao/p/11383260.html
Copyright © 2011-2022 走看看