您的位置:首页 > 其它

3. Longest Substring Without Repeating Characters

2016-04-28 09:24 405 查看
Given a string, find the length of the longest substring without repeating characters.

Examples:

Given “abcabcbb”, the answer is “abc”, which the length is 3.

Given “bbbbb”, the answer is “b”, with the length of 1.

Given “pwwkew”, the answer is “wke”, with the length of 3. Note that the answer must be a

substring, “pwke” is a subsequence and not a substring.

给定一个字符串,求最大不重复子串的长度

第一次尝试

发现我解决问题总是喜欢从最简单的方法入手,要是没有像leetcode上时间复杂度或者空间复杂度的限制,我就仅仅是实现了功能而已,这是作为程序员的悲哀,我们需要不断的优化自己的产品

我首先想到最简单的解决方法是两层循环,有人发现这个解决方案之后可能会继续寻找更好的,但我不是,我要先把他实现出来,看一看效果

class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
max = 0
for i in range(len(s)):
sub = [s[i]]
for j in range(i+1, len(s), 1):
if s[j] in sub:
break
else:
sub.append(s[j])
max = len(sub) if len(sub) > max else max
return max




很不幸,超时!

第二次尝试

经过上面的失败之后,一小段时间内,我在脑海中搜索可能的解决方案,但都无功而返,后来解决这个问题的想法不再那么强烈了,大部分原因是工作上需要赶一个运维的同事需要的脚本,另外近期发布的版本上实现了较多新功能,测试过程中需要定位一些问题。一放就是3个多星期

昨天早上,突然意识到在第一次尝试中,做了很多不必要的操作,就让我试一试能不能讲清楚:

为了解决这个问题,我需要两个变量来保存一些状态:

int max=0  # 用来保存当前最长不重复子串的长度,初始等于0
window = {}  # 用来保存个字符及对应所在字符串中的索引


开始循环,从输入字符串的第一个字符开始,判断当前字符在不在window中

如果不在,则更新window:window[s[i]] = i。判断当前子串是不是最长不重复子串,如果是更新max,不是就不需要更新max

如果在,获取这个字符第一次出现的位置保存到start,清空window,从start+1到当前字符,逐个更新位置到window中

返回max

class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
max = 0
window = {}
for i in range(len(s)):
if s[i] in window:
new_window_start = window.get(s[i]) + 1
window = {}
for j in range(new_window_start, i+1, 1):
window[s[j]] = j
else:
window[s[i]] = i
window_size = len(window)
max = window_size if window_size > max else max
return max


如图:440ms,超过了6.35%的coder

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: