蛮力法
思路:从第一个字符开始找最大的子串,接着从第二个字符开始找最大的子串…以此类推,把每次找到的子串数放在一个空的数组,最后返回数组的最大数。
缺点:简单粗暴,超出时间限制
代码如下:
class Solution:
def lengthOfLongestSubstring(self,arr):
if arr is None or len(arr) == 0: #空字符的情况
return 0;
count_list = [1] #max(count_list)如果count_list是空的就报错,所以放了个1
for i in range(len(arr)):
temp = []
count = 1
for j in range(i+1,len(arr)):
temp.append(arr[i])
if arr[j] not in temp:
temp.append(arr[j])
count += 1
else:
break #这一步体现了子串,而不是子序列
count_list.append(count)
return max(count_list)
无奈到字符串超长,这个算法的复杂度太高了,目测是O(n^2),我这菜鸟水平只能写出这个爆炸的算法。
哈希查找
当然是参考了一堆大神的解法,说是要借助哈希查找key的O(n)的时间复杂度,不然你就不过,吓得我赶紧恶补了一下哈希查找。
class Solution:
def lengthOfLongestSubstring(self,s):
ans = 0
#left用于记录合法的左边界位置,last用于记录字符上一次出现的位置
left = 0
last = {}
for i in range(len(s)):
#子串中出现重复字符,变更left至上一次s[i]出现位置之后,使得子串合法
if s[i] in last and last[s[i]] >= left:
left = last[s[i]] + 1
last[s[i]] = i
ans = max(ans,i-left+1)
return ans
不懂什么意思,明天再来理解