LeetCode第三题,求无重复的最长子串,这题比较简单。不多说,直接上题。
这一题题目的提示里有提到空格,但我觉得空格也算字符,毕竟空格还有ASCII码呢,ASCII码值为32,这个考试可能会考到的。
不多说,上代码:
def solution(origina_str):
# 一个字符串类型的变量存放最长子串。
max_sub_str = ""
# 循环获取所有字串
for i in range(len(origina_str)):
for j in range(i + 1, len(origina_str) + 1):
set_1 = set()
# 字符串切片后的子串。
sub_str = origina_str[i:j]
# 将子串的每个字符存入集合,利用集合的无重复性,重复的字符不会再存。
for k in sub_str:
set_1.add(k)
# 如果集合长度不等于字串长度,则表示有重复字符,直接舍弃。
# 而且因为已经有重复字符,后面的子串也一定会有。
if len(set_1) != len(sub_str):
break
else:
# 取最长子串
if len(sub_str) > len(max_sub_str):
max_sub_str = sub_str
return len(max_sub_str)
老样子,两层for循环,第一层控制子串的头,第二层控制子串的尾,j从i之后开始寻找,获取子串的时候需要用到字符串切片,这个可以自己上网查资料。创建一个集合set_1,因为集合是无重复的,找到的子串,将字符一个个往集合里放,就能检验出来是否有重复字符。
举个例子:假如子串是Hello,用字符串表示就是str = "Hello",如果把这些个字符统统放入集合中,那么集合里面可能是这样一种情况:set = {"e", "H", "l", "o"},因为集合是无序的嘛。这样,集合的长度就是4,字符串的长度就是5,一比较,集合小了。那就表示有重复的字符。
找出来一个无重复字符就可以跟当前最长的无重复字符比较,更长的话就替换,否则就不管他,执行下一轮。
这是我测试的样子:
# 初始字符串
str_1 = "a w2afo an1 1ofn1a"
# 初始空列表,存放筛选出来的无重复子串
print(solution(str_1))
结果是这样:
6
如果想知道求得的最长子串是哪一串的话,在函数的return前面加上print就行:
w2afo
6
注意:空格也是字符,他的ASCII码是32!!!
最后,我写的时候没看答案,这串代码肯定是比答案垃圾,仅做启发编程思维使用,如果出现Bug还请指正。
如果这篇文章对你有帮助的话,就点个赞吧,谢谢啦