寻找字符串中最大的无重复字符串长度:
思路:
这道题主要用到思路是:滑动窗口
什么是滑动窗口?
其实就是一个队列,比如字符串中的 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列表中所有字符的长度,取最大长度的字符串即可。