做了几个leecode题目以后感觉数据结构方面的知识比较薄弱,需要加强啊。
首先逻辑理清楚,u是不重复的字符串,初始化为空字符串,res是我们要返回的结果,初始化为0。
1.for循环次数为s字符串长度,每次循环的字符串用k表示。
2.如果k不在u里面,把k加到u里面,res等于u的长度和res中的最大值。
3.如果k在u里面,说明已经出现重复的字符,这个时候k是一个和u中有重复的字符,index是找出k字符在u中的索引位置,将u更新为
u=u[index+1:]+k
然后继续循环直至循环完毕。
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
res = 0
u = ''
for i in range(len(s)):
k = s[i]
if k not in u:
u+=k
res = max(len(u),res)
else:
index = u.find(k)
u = u[index+1:]+k
return res
有几个有意思的地方,u也可以用空列表,那么寻找索引就要使用u.index(k),当然字符串也可以使用u.index(k)来索引,试了一下发现还是字符串更快一点。
如果直接循环s中的字符k,即for k in s:,代码可以少一点,但是实际性能也不如现在的。
字符串方法(常用)
1.搜索与替换
- str.find('x') 返回第一个'x'出现的下标,多个时返回第一个,没有时返回-1。参数可加起始位置和结束为止。
- str.index('x') 同上,但是不存在时会返回异常。
- str.count('x') 返回x出现的次数。
- str.replace(old,new) 替换字符串。
- str.format() 字符串格式化。
2.字符串的分割与拼接
- str.split() 将字符串分割开来,括号里可以加入分割的方式,默认按照空格分割。
- s.join(str) 将s依次插入到str的每个间隔里,s是字符串。
- str[start:end] 左包右不包的切片。
3,字符串的测试和替换函数
- S.startswith(prefix[,start[,end]]) #是否以prefix开头
- S.endswith(suffix[,start[,end]]) #以suffix结尾
- S.isalnum() #是否全是字母和数字,并至少有一个字符
- S.isalpha() #是否全是字母,并至少有一个字符
- S.isdigit() #是否全是数字,并至少有一个字符
- S.isspace() #是否全是空白字符,并至少有一个字符
- S.islower() #S中的字母是否全是小写
- S.isupper() #S中的字母是否便是大写
- S.istitle() #S是否是首字母大写的
4.删除空格与特殊符号
- str.strip() 去掉字符串两端空格和换行符
- str.strip('') 去掉字符串两端空格
- str.strip('x') 去掉某个字符串
- str.lstrip() 去掉左边的空格和换行符
- str.rstrip() 去掉右边的空格和换行符