zoukankan      html  css  js  c++  java
  • 【LeetCode】无重复字符的最长子串

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

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

    【思路】

    首先我们现在看一下最简单的一个字符串的查找,比如"ydyw",首先左边界left=0,我们开始遍历,每遍历一个位置,如果没有重复的元素,那么max_len=i-left+1,然后对max_len进行更新!如果找到一个重复的元素,比如遍历到i=2,此时y重复,那么我们要更新左边界的索引为上一次该元素索引值+1,这样就保证了此时[left:i]即[1:2]中没有元素重复!

    由于我们需要使用上一次遍历的索引值,因此我们使用hashmap来进行存储,我们可以使用"边遍历边建立hashmap"的思想!

    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            int left = 0, max_len = 0;
            unordered_map<char, int> hashmap;
            for(int i = 0;i < s.size(); i++){  
                if(hashmap.find(s[i]) != hashmap.end()){
                    left = max(left, hashmap[s[i]]+1);
                    // 如果找到了,左边界更新为上一个遍历该元素索引值+1
                }
                max_len = max(max_len, i-left+1);
                hashmap[s[i]] = i;
            }
            return max_len;
        }
    };
  • 相关阅读:
    基于RSA securID的Radius二次验证java实现(PAP验证方式)
    一些指令 & 一些知识 (Linux Spring log4j...)
    RSA, ACS5.X 集成配置
    Python中的动态属性与描述符
    设计模式(一):单例模式
    JavaWeb
    动态规划_背包问题
    动态规划_最长上升子序列
    MySQL复习
    动态规划_数字三角形
  • 原文地址:https://www.cnblogs.com/zhudingtop/p/11509087.html
Copyright © 2011-2022 走看看