最长子串算法 python_python基础算法之最长子串问题

该博客介绍了一种算法问题,即在给定的字符串中找到最长的不包含重复字符的子串。解决方案包括了两种思路:1) 边遍历字符串边更新最长子串的长度;2) 使用字典记录每个字符最后出现的位置,更新目标子串的起始位置。提供的Python代码实现了一个高效的方法来解决这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

找出一个字符串的最长字符串,要求该字符串中没有重复的字符。

注意点:

考虑空字符等特殊情况

例子:

输入: "abcabcbb" 输出: 3

输入: "bbbbbb" 输出: 1

思路

思路1.0: 先分片,分完片之后找出最长的

思路1.1: 不需要全分完再找最长的,可以边分边从二者当中选最大,例如第1,2个分片完成后即可选出最大的一个

思路2.0: 如何利用下标分片?

循环遍历,记下各个字母对应的出现的最近一次下标,如果这次出现的下标大,那么刷新目标串的起始位置

思路2.1: 如何记录?

用字典,列表都可,列表不允许in操作,那么就利用映射。

代码参考

class Solution(object):

def lengthOfLongestSubstring(self, s):

"""

:type s: str

:rtype: int

"""

if not s:

return 0

if len(s) <= 1:

return len(s)

locations = [-1 for i in range(256)]

index = -1

m = 0

for i, v in enumerate(s):

if (locations[ord(v)] > index):

index = locations[ord(v)]

m = max(m, i - index)

locations[ord(v)] = i

return m

if __name__ == "__main__":

assert Solution().lengthOfLongestSubstring("abcea") == 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值