zoukankan      html  css  js  c++  java
  • [LeetCode] Longest substring without repeating characters 最长无重复子串

    Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

    题意:给定字符串找到最大无重复子串。

    思路:参考LeetCode中提交的答案。使用哈希表的思想,建立一个256位大小的整型数组来代替哈希表(原因不知,博友Grandyang给出的原因是是ASCII表共能表示256个字符,所以可以记录所有字符。)哈希表中,在没有遇到重复字符之前,将当前字符对应的值赋为其在给定串s中的下标;当遇到重复字符时,因,该重复字符对应的值(即该字符的下标)大于上一串没有重复字符的起点下标,所以更新新子串的起点(深刻理解这句话),并记下此时的maxLen值。我们以s="abcabcb"为例,分析整个过程。当遍历到第二个 "a"时,m[s[i]]=0>-1 ,所以,start=0,同理可以更新后面的字符对应的值,更新过程用图表示如下:


    update 2019-1-8:图可能没有表示清楚,若是看图不好理解,请忽略,后续问题我会改进的。

    代码如下:

     1 class Solution {
     2 public:
     3     int lengthOfLongestSubstring(string s) 
     4     {
     5         vector<int> m(256,-1);
     6         int maxLen=0,start=-1;
     7         for(int i=0;i<s.size();++i)
     8         {
     9             if(m[s[i]]>start)  //有重复
    10                 start=m[s[i]];
    11             m[s[i]]=i;      //更新
    12             maxLen=max(maxLen,i-start);
    13         }
    14         return maxLen;
    15     }
    16 };

    注意:两部分不重复子串存在交叉的情况。不能使用这样的思路:记录两字符中间的长度,然后以第二字符为开始遍历得到新的字符,因为若是有交叉的情况,如abcade,abc和bcade存在交叉,返回值应该是5(bcade),不是3(abc或者ade)。

  • 相关阅读:
    C语言中条件表达式求最大值和最小值
    面向对象编程:Java的简单数据类型
    JAVA学习经验谈
    JAVA的入门基础一些精典
    面向对象编程:Java复杂数据类型用法
    面向对象编程:Java的简单数据类型
    面向对象编程:Java collection更有效管理elements
    从C++到Java 理解面向对象是关键所在
    JAVA学习经验谈
    JAVA的入门基础一些精典
  • 原文地址:https://www.cnblogs.com/love-yh/p/7075512.html
Copyright © 2011-2022 走看看