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

LeetCode#3 Longest Substring Without Repeating Characters

时间:2015-07-27 20:57:10      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:

Problem Definition:

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.

Solution:

事实上符合条件的子串是夹在两个相同字母之间且没有夹着相同字符的串(极端情况是整个串)。如 a*****abcd***a

可以使用两边游标来扫描字符串,用这俩游标的间距来算子串的长度。右边的游标持续往右移动直到串尾,左边的游标只在进入新的子串时更新。

扫的过程中还要进行这些操作:记录下扫过的字符及其所在的坐标;更新最长不重复子串的长度。

1)开始扫描 j==0, i==0

 

 技术分享

 

2)i开始向右移动,j尚未动。随着i的移动,不重复子串的长度也增加。当前的子串长度是i-j+1。最大不重复子串的长度应实时更新。

   技术分享

3)字符d已经在前面被扫到了,当再次扫过一个字符d时,应更新左游标,开始新的串。把左游标放在此前出现的那个d的后一个位置,新的串从这个开始。

   同时,字符d的位置记录也要更新为更右边的这个位置。

技术分享

4)右游标继续前进,到达一个字符a,发现它以前出现过,但以前出现的位置已经再左游标的坐标,属于旧的串,不影响新串,因此不更新左游标j。

 技术分享

5)右游标还在前进,直到遇到一个字符f,它也已经出现过,并且这个位置在j的右边,属于新串,因此更新j 到f上次出现的位置的后边。

    技术分享

代码写起来是很简洁的。

    # @param {string} s
    # @return {integer}
    def lengthOfLongestSubstring(s):
        dic,length,j={},0,0
        for i,c in enumerate(s):
            if c in dic:
                j=max(j,dic[c]+1)
            dic[c]=i
            length=max(length,i-j+1)
        return length

 

LeetCode#3 Longest Substring Without Repeating Characters

标签:

原文地址:http://www.cnblogs.com/acetseng/p/4681094.html

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