给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
最近接连着三晚上,从10点开始去思考这道题。尝试着从队列的结构去思考这道题:代码如下
def lengthOfLongestSubstring(s):
import copy
stack = []
last_sub_str = []
final_sub_str = []
for i in range(len(s)):
if s[i] not in stack:
stack.append(s[i])
else:
# print('{}{}'.format(s[i],i+1))
if len(last_sub_str) > 0:
for char_last_sub_str in last_sub_str[::-1]:
if char_last_sub_str in stack:
break
else:
stack.insert(0,char_last_sub_str)
if len(stack) > len(last_sub_str):
final_sub_str = copy.deepcopy(stack)
last_sub_str = copy.deepcopy(stack)
else:
last_sub_str = copy.deepcopy(stack)
while stack:
stack.pop()
stack.append(s[i])
else:
last_sub_str = copy.deepcopy(stack)
final_sub_str = copy.deepcopy(stack)
while stack:
stack.pop()
stack.append(s[i])
if len(stack) > 0:
# print(stack)
# print(last_sub_str)
# print(final_sub_str)
for char_last_sub_str in last_sub_str[::-1]:
if char_last_sub_str in stack:
# print(1)
break
else:
stack.insert(0, char_last_sub_str)
if len(stack) >= len(final_sub_str):
# print(2)
final_sub_str = copy.deepcopy(stack)
print(final_sub_str)
return len(final_sub_str)
else:
# print(3)
print(final_sub_str)
# return len(final_sub_str)
比较有意思的是,在做这道题的时候,提交了好多次,每次都有新的输入对你产生阻碍。
因为队列有先进先出这一思想,找到当前最长的结果后就会把结果这些相关信息 “送走”,当你需要根据前面的字符去计算后面可能性最长的字符时,你的信息时丢失的。 如果有小伙伴看到这里不明白,可以先试着去理解代码。跑一些字符串检验下结果。尝试着理解下我说的问题。
LeetCode 给这道题有 987 个测试用例。
测试到549个例子 str_1 = "bpoiexpqhmebhhu" 时出现错误。报错,很有意思的事情,你的结果是这样的,按照上面的代码逻辑,这就是最好的结果了。
但是,leetcode给出的是
应该是我的逻辑缺失导致这个问题的产生。这里也留下一个以后的工作。继续按照队列的思想,去完善这个题的逻辑。
代码通过是按照暴力法解决的,代码很少也很明了:
def baoli(s):
import copy
length_str = len(s)
print(length_str)
final_sub_str = []
temp_sub_str = []
for i in range(length_str):
print(i)
for j in range(i,length_str):
print("---{}{}".format(j,s[j]))
if s[j] not in temp_sub_str:
temp_sub_str.append(s[j])
else:
break
print(temp_sub_str)
if len(temp_sub_str) > len(final_sub_str):
final_sub_str = copy.deepcopy(temp_sub_str)
while temp_sub_str:
temp_sub_str.pop()
# print(final_sub_str)
return len(final_sub_str)
结果:,很喜人,很暴力。结果很不理想。 tmd。
以后有时间还是回去提高用时和内存的!