leetcode题----寻找字符串中无重复字符串的最长字串----滑动窗口法

寻找字符串中最大的无重复字符串长度:

思路:
这道题主要用到思路是:滑动窗口

什么是滑动窗口?

其实就是一个队列,比如字符串中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!

如何移动?

我们只要把队列的左边的元素移出就行了,直到满足题目要求!

一直维持这样的队列,找出队列出现最长的长度时候,求出解!

s = "aakabcwweddf"
def findMaxLen(s):
    if not s: return 0
    left = 0
    lookup = set()
    n = len(s)
    max_len = 0
    cur_len = 0
    for i in range(n):
        cur_len += 1
        while s[i] in lookup:
            lookup.remove(s[left])
            left += 1
            cur_len -= 1
        if cur_len > max_len: max_len = cur_len
        lookup.add(s[i])
    print(max_len)
    return max_len

findMaxLen(s)  # 输出: 5

 寻找字符串中无重复的最长字符串:

s = "aabcddefgggopi"
def findStrings(s):
    max_len = 0
    cl = []
    result=[]
    for i in range(len(s)):
        if s[i] in cl:
            if cl[0] == s[i]:
                current_len = len(cl)
                if current_len > max_len:
                    max_len = current_len
                result.append(list(cl))
                cl.pop(0)
                #cl.clear()
            elif cl[-1] == s[i]:
                current_len = len(cl)
                if current_len > max_len:
                    max_len = current_len
                result.append(list(cl))
                cl.clear()
        cl.append(s[i])
    final_result = []
    for res in result:
        if len(res) == max_len:
            final_result.append(res)
    print(final_result)  #输出:[['a', 'b', 'c', 'd'], ['d', 'e', 'f', 'g']]

具体思路:

遍历字符串中所有字符,逐个字符加入到 cl列表

cl 列表记录当前的字符串,如当前cl列表中字符串为 [a,b,c]

现在分两种情况:

1.若下一个进入cl列表的字符串与cl的最左边的字符(即a)相同:

则 cl中把最左边的字符(即a)从cl中删除

2.若下一个进入cl列表的字符串与cl的最右边的字符(即c)相同:

则先把当前cl的字符串(即a,b,c)加入到result列表中,作为保存结果,然后把cl列表清空。

遍历完所有字符后,result列表里装的就是 s字符串中所有连续不重复的子字符串。

最后求出result列表中所有字符的长度,取最大长度的字符串即可。

发布了270 篇原创文章 · 获赞 408 · 访问量 76万+

猜你喜欢

转载自blog.csdn.net/u014453898/article/details/103554166