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)。

  • 相关阅读:
    2491 玉蟾宫
    1704 卡片游戏
    1020 孪生蜘蛛
    1215 迷宫
    3149 爱改名的小融 2
    1316 文化之旅 2012年NOIP全国联赛普及组
    1664 清凉冷水
    157. [USACO Nov07] 奶牛跨栏
    [SCOI2005]繁忙的都市
    【NOIP2014模拟赛No.1】我要的幸福
  • 原文地址:https://www.cnblogs.com/love-yh/p/7075512.html
Copyright © 2011-2022 走看看