题目描述
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
题目链接:剑指 Offer 48. 最长不含重复字符的子字符串
例:
- 输入 "abcabcbb" 输出 3
- 输入 "bbbbb" 输出 1
思路
1.暴力滑动窗口
此方法是我看了滑动窗口的描述后自己写的,没参考别人的设计但是时间消耗不忍直视。
我在我的解法中设计了一个辅助空串helper和用于记录最大长度的n,之后将原字符串s遍历并判断:
- 对于s中的每一个字符_s,如果helper里的每一个字符都和_s不同,那么直接将_s拼接到helper尾部;
- 若相同,则对helper进行切片,切片位置就是helper中第一个和_s重复的字符的索引下标,之后再将_s拼接到helper尾部。
之后再判断当前串的长度是否是最大长度,若是则更新用来保存最大长度的参数n。
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
n = 0 # 记录最大长度
helper = "" # 辅助串
for _s in s:
if helper == "": # 如果辅助串为空,直接添加(这里应该可以优化)
helper += _s
for i in range(len(helper)): # 对辅助串内已有的元素遍历,看是否与当前操作的_s相同
if helper[i] == _s:
helper = helper[i+1:] # 相同,则切片
break # 直接跳出循环
helper += _s
if len(helper) > n: # 判断当前辅助串的长度是否是最大长度
n = len(helper)
return n