最长不重复子串python_Python编程题16--最长不重复子串

题目

给定一个字符串,请从这个字符串中找出所有最长的没有重复字符的子串,并返回最长不重复子串的长度。

例如:

字符串:mabcafrab ==> 最长不重复子串:bcafr,长度5

字符串:pwswekedw ==> 最长不重复子串:swek, kedw,长度4

实现思路

设置一个字典 temp_dict ,用于存储每个字符在字符串中的最新位置

设置一个列表 str_list ,用于存储不同的子串

设置两个变量 start、max_length,分别表示 计算子串长度时的起始索引下标 和 最大子串长度

遍历字符串,如果当前字符已在字典中,那么直接更新 start 的值,比较 temp_dict[cur] + 1(该字符所在位置 + 1)、start ,取其中的最大值

计算子串时,从 start 到 i 的子串长度为 i - start + 1 ,如果该长度大于 max_length ,那么就更新 max_length 为 i - start + 1 ,同时将这里的子串存储到列表 str_list 中

遍历的时候,每次都要把当前字符及其最新位置存储到 temp_dict 中

从列表 str_list 中,找出元素长度为 max_length 的所有子串

最后返回最长不重复的所有子串及其长度

代码实现

def get_longest_string(s):

temp_dict = {}

str_list = []

start, max_length = 0, 0

for i in range(len(s)):

cur = s[i]

if cur in temp_dict:

start = max(temp_dict[cur] + 1, start)

if i - start + 1 >= max_length:

max_length = i - start + 1

str_list.append(s[start:i+1])

temp_dict[cur] = i

res_str = ", ".join([i for i in str_list if len(i) == max_length])

return res_str, max_length

s1 = "mabcafrab"

res = get_longest_string(s1)

# 最长不重复子串为:bcafr ,其长度为:5

print("字符串 {:20} 中,最长不重复子串为:{:20},其长度为:{:2}".format(s1, res[0], res[1]))

s2 = "pwswekedw"

res = get_longest_string(s2)

# 最长不重复子串为:swek, kedw ,其长度为:4

print("字符串 {:20} 中,最长不重复子串为:{:20},其长度为:{:2}".format(s2, res[0], res[1]))

s3 = "abcabb"

res = get_longest_string(s3)

# 最长不重复子串为:abc, bca, cab ,其长度为:3

print("字符串 {:20} 中,最长不重复子串为:{:20},其长度为:{:2}".format(s3, res[0], res[1]))

s4 = "pwwkew"

res = get_longest_string(s4)

# 最长不重复子串为:wke, kew ,其长度为:3

print("字符串 {:20} 中,最长不重复子串为:{:20},其长度为:{:2}".format(s4, res[0], res[1]))

s5 = "p"

res = get_longest_string(s5)

# 最长不重复子串为:p ,其长度为:1

print("字符串 {:20} 中,最长不重复子串为:{:20},其长度为:{:2}".format(s5, res[0], res[1]))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值