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 };
  • 相关阅读:
    第三篇——第二部分——第三文 配置SQL Server镜像——域环境
    DOS命令学习(从入门到精通)
    Cocos2d-x3.0 LoadingBar
    微信对接HIS——微信可查检验结果
    微信iOS SDK文档总结
    Azure编程笔记(4):配置Cloud Service的证书
    android的ViewPager和Animation的一些使用(一)
    小虾米的鳄鱼梦
    Hadoop源码分析21:namenode概要
    Hadoop源码分析20:datanode概要
  • 原文地址:https://www.cnblogs.com/wmx24/p/9141928.html
Copyright © 2011-2022 走看看