python3实现无重复字符的最长子串——滑动窗口算法

题目

给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。

示例 1:

输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

题目来源: https://leetcode-cn.com/problems/longest-substring-without-repeating-characters)

滑动窗口算法

滑动窗口算法可以用以解决数组/字符串的子元素问题,它可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度。

窗口可以是固定大小,起始和终止位置同时变化。

也可以是可变大小,起始和终止位置不同时变化。

参考链接: https://www.zhihu.com/topic/20746237/intro

思路

利用滑动窗口,从第一个字符开始向后查看,当找到重复字符k时,将字串k(包括k)之前的字符全部舍去,然后更新maxlen的大小,直至移动到结尾。

python代码实现

(注意获取长度的细节)

def lengthOfLongestSubstring(s: str) -> int:
    i=1 #当前字符的位置
    begin=0
    maxlen=0
    dropedlen=0#记录舍去的字符串的长度
    if len(s)==0:
        return 0
    if len(s)==1:
        return 1
    for i in range(len(s)):
        if s[i] in s[begin:i]:
            # 先更新maxlen
            templ=len(s[begin:i])
            print("s[i]="+s[i])
            print("字串="+s[begin:i])
            print("templ = "+str(templ))
            maxlen=templ if(templ>maxlen) else maxlen
            # 舍去字串s[begin:i]中s[i]字符及前面的字符
            # 直接用s[begin:i].index(s[i])获得的是相对位置,不是在s中的位置,应该加上dropedlen
            relativelen=s[begin:i].index(s[i])#重复的字符串的相对位置
            begin=relativelen+dropedlen+1
            dropedlen=begin#更新删除的长度
    # 到字符串末再更新一次maxlen
    templ=len(s[begin:i])+1
    maxlen=templ if(templ>maxlen) else maxlen
    return maxlen


s = "au"
print("答案:"+str(lengthOfLongestSubstring(s)))
posted @ 2020-02-13 15:41  墨莲玦  阅读(825)  评论(0编辑  收藏  举报