def lengthOfLongestSubstring(s):
# 无字符的情况
if len(s)==0:
return 0
# a用来表示不同符合要求的字符串的长度,b用来表示存放符合要求的字符串
a = []
b = []
# 生成字符串
for i in range(len(s)):
for j in range(len(s)+1):
if len(s[i:j])!=0:
b.append(s[i:j])
# 所有的字符串
print(b)
# 进行筛选
for i in range(len(b)):
for m in range(len(b[i])):
# 除自身外无重复的
if b[i].count(b[i][m])!=1:
b[i]='0'
print(b)
# 此时已经筛选完成,将b中字符全部转化为长度
for i in range(len(b)):
a.append(len(b[i]))
return max(a)
IndexError: string index out of range
思路:生成字符串进行筛选
b[i]='0'这句有问题
后面加个break
你都把整个字符串改成'0'了,还继续循环,能不越界吗
其实有个简单的思路:把字符串转list然后再转set,那么重复的就自动没了,如果长度还和原来一样就是没有重复的,代码要精简很多
下标越界
代码如下:
def lengthOfLongestSubstring(s):
# 无字符的情况
if len(s)==0:
return 0
# a用来表示不同符合要求的字符串的长度,b用来表示存放符合要求的字符串
a = []
b = []
# 生成字符串
for i in range(len(s)):
for j in range(len(s)):
if len(s[i:j])!=0:
b.append(s[i:j])
# 所有的字符串
print(b)
# 进行筛选
for i in range(len(b)):
for m in range(len(b[i])):
# 除自身外无重复的
if b[i].count(b[i][m])!=1:
b[i]='0'
print(b)
# 此时已经筛选完成,将b中字符全部转化为长度
for i in range(len(b)):
a.append(len(b[i]))
return max(a)
一行代码就能搞定了:
def lengthOfLongestSubstring(s):
return max(len(t) for t in [s[i:j] for i in range(len(s)) for j in range(i+1,len(s)+1)] if len(t)==len(set(t))) if s else 0