zoukankan      html  css  js  c++  java
  • LeetCode 无重复字符的最长子串(探索字节跳动)

    题目描述

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

    示例 1:

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

    示例 2:

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

    示例 3:

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

    解题思路

    用一个map记录当前子字符串的所有字符,字符串依次向右扩展,若当前子字符串已有该字符,则从当前子字符串的第一个字符开始遍历,对于不同于该字符的字符在map中删除,直到遇到当前字符则停止,下一次扩展就从此字符的下一个位置开始;若当前子字符串没有该字符,就在map中记录该字符。

    代码

     1 class Solution {
     2 public:
     3     int lengthOfLongestSubstring(string s) {
     4         if(s.empty()) return 0;
     5         map<char, int> m;
     6         int max_len = 1, left = 0, right = 0;
     7         while(right < s.length()){
     8             if(m.count(s[right]) == 0)
     9                 m[s[right]] = 1;
    10             else{
    11                 while(left < right && s[left] != s[right]){
    12                     map<char, int>::iterator it;
    13                     it = m.find(s[left]);
    14                     m.erase(it);
    15                     left++;
    16                 }
    17                 left++;
    18             }
    19             max_len = max(max_len, right - left + 1);
    20             right++;
    21         }
    22         return max_len;
    23     }
    24 };
  • 相关阅读:
    HDOJ 1877
    POJ 2210
    HDOJ 1230(火星A+B)
    大数想减
    HDU 2115
    HDOJ 1234
    HDOJ 3784
    HDOJ3782(xxx定理)
    C# 使用 Stopwatch 测量代码运行时间
    SQL返回当前天是星期几
  • 原文地址:https://www.cnblogs.com/wmx24/p/10138634.html
Copyright © 2011-2022 走看看