Leetcode:无重复字符的最长子串

题目描述: 在这里插入图片描述下面说一下我的思路:
第一种:暴力法,就是写两层for循环,外层负责次数,内层负责向后查找。
时间复杂度:O(n2) ,在不顾及contains的时间复杂度情况下
举个例子:
“abcabcbb”
定义:我们定义ss表示子字符串,s为题目给的字符串,i为外层循环计数,j为内层循环计数,ch为当前需要判断的字符。
我们的意愿是这样的:ss始终为s的不重复子串,i表示在s的字符下标进行遍历,并以该位置为字串ss的第一个元素,然后开始内存循环,去判断从在s中i位置的下一个i+1位置字符是否被ss字串包含(即,ss.contains(s.charAt(j)+"")),如果不包含则,把这个字符加入到ss字串中,继续内层循环查找下一个字符,即j++;如果包含,则说明ss字串中存在一个和当前j位置字符相同的字符,所以ss字串在当前情况下不能再增加长度了,我们通过max = Math.max(max,ss.legth())记录下最大子串长度,终止内层循环,外层循环i++,然后继续外层循环,去查找下一个字串,并在查找前清空ss子串内容。
具体过程:
s = “abcabcbb” //我设ch表示当前需要判断的字符ch=s.charAt(j)
外层第一次:i = 0,ss=“a”----内层第一次:j=1,ch=‘b’,不包含,ss=“ab”
----内层第二次:j=2,ch=‘c’,不包含,ss=“abc”
----内层第三次:j=3,ch=‘a’,包含,max=Math.max(max,ss.length()) //max =Math.max(0,3) =3 终止内层循环

外层第二次:i = 1 , ss= “b”
----内层第一次:j=2,ch=‘c’,不包含,ss=“bc”
----内层第二次:j=3,ch=‘a’,不包含,ss=“bca”
----内层第三次:j=4,ch=‘b’,包含,max=Math.max(max,ss.length()) //max =Math.max(3,3) =3 终止内层循环

外层第三次:i = 2,ss= “c”
… …
最终返回max
提交代码:在这里插入图片描述

第二种:是在第一种上的优化。
我的思路:比如“abcdcacbb”在发现子串"abcd"的下一个字符时发现重复字符‘c’,这时按照第一种的做法是终止内层,外层从i++开始也就是‘b’开始,其实不用这样的,因为从’c’往前的字符开始找的子串都不会超过当前子串的长度,所以我们保留ss子串中从重复字符下一个字符开始到结尾的字串作为新字串并加上当前字符,即“ac”。然后让i从当前字符位置的下一个开始继续判断。感觉和滑动窗口的思想差不多。
时间复杂度:O(n),在不顾及contains时间复杂度情况下。虽然写了两层循环,但是实际上只走了j,让j从i+1走到s.length()就结束了。
我的提交:

下来是我参考leedCode解题的思路及代码:

**第三种:**只用了一层循环,其实和第二种思路基本一致,就是代码更加清晰了
时间复杂度:O(n),在不顾及contains时间复杂度情况下

我的提交: 在这里插入图片描述

第四种:滑动窗口法
时间复杂度:最坏O(2n),故为O(n)
参考代码:在这里插入图片描述

第五种:使用HashMap优化滑动窗口
时间复杂度:O(n)
参考代码:
在这里插入图片描述

第六种:使用ASCII码对滑动窗口优化
以前的我们都没有对字符串 s 所使用的字符集进行假设。
当我们知道该字符集比较小的时侯,我们可以用一个整数数组作为直接访问表来替换 Map。
常用的表如下所示:
int [26] 用于字母 ‘a’ - ‘z’或 ‘A’ - ‘Z’
int [128] 用于ASCII码
int [256] 用于扩展ASCII码
复杂度分析:
时间复杂度:O(n),索引 j 将会迭代 n 次。
空间复杂度(HashMap):O(min(m,n)),与之前的方法相同。
空间复杂度(Table):O(m),m 是字符集的大小。
参考代码:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值