zoukankan      html  css  js  c++  java
  • LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)

    题目描述

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

    示例:

    给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

    给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

    给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串"pwke" 是 子序列  而不是子串。

    解题思路

    采用双指针的思想,维护两个指针i、j,i为无重复子串的右端点,j为无重复子串的左端点,这样此子串的长度为i-j+1.再用哈希的思想维护一个大小为128的数组,其下标代表ASCII码共128个字符,下标对应的值记录当前字符最后一次出现位置的后一个位置。这样做的目的是在子串中遇到重复的字符时,下一个无重复子串一定不包含左边的重复字符,所以直接从左边重复字符的后一个位置继续寻找。令哈希数组初始全为0,这样i每次向后走一步,

    • 若i指向的字符在j~i-1的字符串中出现,即哈希数组中当前字符下标对应位置大于j,则j指向左边重复字符的后一个位置,否则j不动
    • 接着计算当前无重复子串的长度并更新最大长度
    • 最后修改哈希数组,使当前字符下标对应值为当前位置+1

    代码

     1 class Solution {
     2 public:
     3     int lengthOfLongestSubstring(string s) {
     4         int idx[128] = {0};
     5         int maxLen = 0;
     6         for(int i = 0, j = 0; i < s.size(); i++){
     7             j = max(idx[s[i]], j);
     8             maxLen = max(i-j+1, maxLen);
     9             idx[s[i]] = i+1;
    10         }
    11         return maxLen;
    12     }
    13 };
  • 相关阅读:
    Failed to start mysqld.service: Unit not found
    Nginx转发前后端分离跨域引发的问题-转发请求header头中含有下划线,无法转发取值
    云上Centos7新硬盘挂载流程
    马哥教育第二阶段考试
    Linux集群准备-同步
    Lucene查询语法
    权限系统设计
    docker compose thinkphp5.1 lnmp环境搭建加项目部署全过程
    docker compose 的使用
    [转载]PHP-FPM
  • 原文地址:https://www.cnblogs.com/wmx24/p/9141928.html
Copyright © 2011-2022 走看看