码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] Longest substring without repeating characters 最长无重复子串

时间:2017-06-25 10:00:59      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:log   不重复   更新   com   png   color   lin   sub   blog   

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,同理可以更新后面的字符对应的值,更新过程用图表示如下:

技术分享

代码如下:

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

[LeetCode] Longest substring without repeating characters 最长无重复子串

标签:log   不重复   更新   com   png   color   lin   sub   blog   

原文地址:http://www.cnblogs.com/love-yh/p/7075512.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!