博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode 3 - longest-substring-without-repeating-characters
阅读量:6264 次
发布时间:2019-06-22

本文共 1688 字,大约阅读时间需要 5 分钟。

题目

<>

题意

给出一个字符串,求每个字符都不相同的最长子串长度。

现在题目要求我们求出这两个数的和。

Example 1:

Input: "abcabcbb"Output: 3 Explanation: The answer is "abc", with the length of 3.

思路

错误的思路

二分 + Hash

1、既然要找每个字符都不相同的最长子串长度,那么便可以使用二分思想。首先取中值,假如当前中值是存在每个字符都不相同的子串的,说明应该搜索右边的区间。否则,搜索左边区间。这个二分答案的时间复杂度大概是O(log n)。

2、这里还涉及如何判断是否存在长度为K的不相同子串。我的想法是,拿出每一个子串,然后对每个子串使用Hash思想,对字符出现次数进行统计,若有出现2次的字符,那么说明该子串不成立。若遇到一个全部只出现1次的,那么就终止搜索。这一步的时间复杂度是O(n^2)

很可惜,一共900多个样例,最后一个超时了!

正确的思路

滑动窗口

看了题解,才发现大佬的做法真牛P。他的时间复杂度是O(n)。

大概思路是:维护一个字符串不相同的区间,下面把它称为一个窗口。这个窗口只包含互不相同的连续字符。

具体的做法是:设定该区间的左右区间分别是i,j。然后从左到右遍历字符串,对于每一个新来的字符,先判断该字符是否在区间内出现了。

(1)若出现了,说明区间+新字符形成的新字符串是存在重复字符的。那么不应该将字符加入该区间(窗口不应该向右扩增),而且应该将区间的左边界收缩(窗口左边往右收缩),直到对于新字符来说,区间内不存在重复字符。(该区间要时刻保证,只包含互不相同的连续字符)

(2)若没在区间内出现过,说明当前存在更长的不相同的子串。故将该字符加入区间(窗口向右扩增),并且更新最大值。

正确的代码

该代码是参考题解写的。

class Solution {public:    int lengthOfLongestSubstring(string s) {        int a[256];        int n = s.length();        memset(a, 0, sizeof(int)*256);        int i = 0;//“不相同子串”的左区间        int j = 0;//“不相同子串”的右区间        int ans = 0;        while(i

错误的代码

该代码是辣鸡我写的,有1个样例超时了。

class Solution {//toulanboypublic:    int lengthOfLongestSubstring(string s) {                 long long left = 0;        int right = s.length();        long long a[300];        while(left < right){            int mid = ceil((left + right)/2.0);            bool isExist = false;            //判断是否存在长度为mid的互不相同的子串            for(int i=0; i+mid-1

运行结果

Runtime: 12 ms, faster than 99.84% of C++ online submissions for Longest Substring Without Repeating Characters.Memory Usage: 9.2 MB, less than 99.68% of C++ online submissions for Longest Substring Without Repeating Characters.

转载于:https://www.cnblogs.com/toulanboy/p/10663173.html

你可能感兴趣的文章
Sql中的Exists和in
查看>>
如何修改Entity Framework Db Frist模式下的Entity继承关系?
查看>>
redis实现区间查询
查看>>
azkaban使用
查看>>
ajax请求的异步嵌套问题分析
查看>>
CSS样式学习笔记『W3School』
查看>>
maven热部署
查看>>
HTTP协议 请求篇
查看>>
redis的订阅和发布
查看>>
直接插入排序法
查看>>
1. Git-2.12.0-64-bit .exe下载
查看>>
35.使用拦截器实现权限验证
查看>>
嵌套类&内部类
查看>>
POJ 3468 线段树 成段更新 懒惰标记
查看>>
关于SQLServer2008数据如何导入SQL2005的解决办法,高版本数据导入低版本中。
查看>>
双重分页2
查看>>
Java面向对象的三个特征与含义
查看>>
tkinter 创建登陆注册界面
查看>>
linux常用命令
查看>>
决策树-流水线
查看>>