题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串(连续的) 的长度,“pwke” 是一个子序列,不是子串。
自己思路:
1.创建一个新的字符串,设置字符串长度对比位。
2.遍历整个字符串,将遍历过的字符串放入新的字符串内。
代码:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
st = {} #创建新的字典
i, ans = 0, 0 #两个标志位
for j in range(len(s)): #遍历整个字符串
if s[j] in st: #如果当前字符在新创建的字符串内
i = max(st[s[j]], i) #返回当前最大字符串长度
ans = max(ans, j - i + 1) #ans为绝对最大字符串长度
st[s[j]] = j + 1
return ans;
相同思路的另一种方法:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
reslist = ''
maxcount = 0
i = 0
for i in range(len(s)):
if s[i] in reslist:
maxcount = max(len(reslist), maxcount)
while(s[i] in reslist):
reslist = reslist[1:]
reslist += s[i]
return max(len(reslist), maxcount)
第二种方法时间与空间复杂度更小。
补充:python中的hash
哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做哈希函数,存放记录的数组称做哈希表。
一个通俗的例子是,为了查找电话簿中某人的号码,可以创建一个按照人名首字母顺序排列的表(即建立人名 x 到首字母 F(x)的一个函数关系),在首字母为 W 的表中查找 “王” 姓的电话号码,显然比直接查找就要快得多。这里使用人名作为关键字,“取首字母” 是这个例子中哈希函数的函数法则 F(),存放首字母的表对应哈希表。关键字和函数法则理论上可以任意确定。
哈希表是使用 O(1)时间进行数据的插入删除和查找,但是哈希表不保证表中数据的有序性,这样在哈希表中查找最大数据或者最小数据的时间是 O(N)实现。