Longest Substring Without Repeating Characters
2016-07-19 11:06
302 查看
leetcode第三题,要求寻找一个最长不重复连续子串。
最最简单的想法就是双重循环进行遍历,为了提高效率,可以在第二层循环中做文章,可以使用模拟hash来记录使用过的字符,也可以使用python内置的in方法,还可以使用字典来记录,不过这些方法都有一个问题,那就是复杂度都是o(n2),测试数据中有一个很长的字符串,时间不能满足要求。
有没有一种方法可以一遍循环就解决问题呢?分析一下,双重循环是因为需要寻找以每一个字符为开头的子串,这些子串都有可能成为最长不重复连续子串,在寻找过程中,如果碰到重复字母,则这个子串内无论是从哪一个位置开始都不会最大不重复长度都不会超过从start开始的长度,此时立刻终止该子串的查询,记录一下长度是不是最长的,而后接着搜索以下一个字符开头的子串。
最最简单的想法就是双重循环进行遍历,为了提高效率,可以在第二层循环中做文章,可以使用模拟hash来记录使用过的字符,也可以使用python内置的in方法,还可以使用字典来记录,不过这些方法都有一个问题,那就是复杂度都是o(n2),测试数据中有一个很长的字符串,时间不能满足要求。
size = len(s) maxlen = 0 for i in range(size): counter = 1 j = 0 visit = {} visit[s[i]] = 1 for j in range(i+1,size): if s[j] not in visit: counter += 1 else: if counter > maxlen: maxlen = counter break if j == size-1 and counter>maxlen: maxlen = counter
有没有一种方法可以一遍循环就解决问题呢?分析一下,双重循环是因为需要寻找以每一个字符为开头的子串,这些子串都有可能成为最长不重复连续子串,在寻找过程中,如果碰到重复字母,则这个子串内无论是从哪一个位置开始都不会最大不重复长度都不会超过从start开始的长度,此时立刻终止该子串的查询,记录一下长度是不是最长的,而后接着搜索以下一个字符开头的子串。
class Solution(object): def lengthOfLongestSubstring(self, s): """ :type s: str :rtype: int """ start = 0 maxlen = 0 charused = {} size = len(s) for i in range(size): if s[i] in charused and start <= charused[s[i]]: start = charused[s[i]]+1 else: maxlen = max(maxlen,i-start+1) charused[s[i]] = i return maxlen
相关文章推荐
- Qt基于FFmpeg播放本地 H.264(H264)文件
- adapter如何finish activity
- Android studio value 2 (com.android.dex.DexException:资源重复引用或者加载问题)
- pthread_mutex_t
- 在 Linux 上使用 VirtualBox 的命令行管理界面
- 大理石在哪?(Where is the Marble?,UVa 10474)
- 在 Linux 上使用 VirtualBox 的命令行管理界面
- dTree组件的学习
- Disruptor 详解
- C语言putenv()函数:改变或增加环境变量
- Java 的JSON、XML转换方法——目录索引
- org.apache.log4j.Logger 详解
- java 抽象类和接口区别
- 安卓软键盘隐藏
- 高效调用lua函数
- 设置Grails中的domain的字段默认是否允许为空
- Kafka0.8.2.1删除topic逻辑
- json性能测试
- 在 Ubuntu Mate 16.04 上通过 PPA 升级 Mate 1.14
- Java NIO