a=[] res_s='' str="2pw ak85ew" for i inrange(len(str)): for j inrange(len(str)): if j>i: a.append(str[i:j]) print(a)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
cur_len=0; max_len=0; for i inrange(len(a)): list(a[i]) flag=0; for j inrange(len(a[i])): for k inrange(len(a[i])): if k>j: if a[i][k]==a[i][j]: flag=0; else: flag=1; if flag==1: cur_len=len(a[i]) if max_len<cur_len: max_len=cur_len res_s=a[i] print(max_len) print(res_s)
#前面遍历输出整个连续子串没问题 a=[] str="abcbae" for i inrange(len(str)): for j inrange(len(str)): if j>=i: a.append(str[i:j+1]) #print(a) #print(len(a)) #print(a[1])
#封装判断函数 defjudge(str): flag=1 for j inrange(len(str)): for k inrange(len(str)): if k>j: ifstr[k]==str[j]: flag=0 break if flag==0: break return flag
#输出最长连续子串长度 res_s=[] max_len=0 flag=2 for i inrange(len(a)): #print(judge(a[i])) flag=judge(a[i]) if flag==1: if max_len<len(a[i]): max_len=len(a[i]) res_s=a[i] print(max_len) print(res_s)
暴力优化
感谢师哥的引导。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
import math max_len=-math.inf a=set() str="abcbae" for i inrange(len(str)): for j inrange(len(str)): if j>=i: for k inrange(i,j+1): a.add(str[k]) if(len(a)==j+1-i): if max_len<len(a): max_len=len(a) res_s=a print(max_len) print(res_s)
s='2pw ak85ew' res_s='' a=[] max_len=0; for i inrange(len(s)): if s[i] in a: a=a[i+1:] #此处i是原str第i个元素,而不是出现重复的字符的索引 else: a.append(s[i]) if max_len<len(a): max_len=len(a) res_s=a print(max_len) print(res_s)
s='abcbae' res_s='' a=[] max_len=0; for i inrange(len(s)): #print(i) if s[i] in a: index=a.index(s[i]) a=a[index+1:] a.append(s[i]) #print(a) else: a.append(s[i]) if max_len<len(a): max_len=len(a) res_s=a #print(res_s) print(max_len) print(res_s)
3.滑动窗口
滑动窗口算法(Sliding Window Algorithm) Sliding window algorithm is used to perform required operation on specific window size of given large buffer or array. 滑动窗口算法是在给定特定窗口大小的数组或字符串上执行要求的操作。 This technique shows how a nested for loop in few problems can be converted to single for loop and hence reducing the time complexity. 该技术可以将一部分问题中的嵌套循环转变为一个单循环,因此它可以减少时间复杂度。
刚开始看到了这个概念,简单看了看,满脸问号,自己在纸上给了两个例子一步步跑了跑,发现确实很巧妙。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
s='abcbae' l=0 r=0 cur_len=0 max_len=0 substring=[] while l<len(s) and r<len(s): if s[r] in substring: substring.remove(s[l]) l+=1 else: substring.append(s[r]) r+=1 cur_len=r-l if cur_len>max_len: max_len=cur_len res_str=substring print(max_len) print(res_str)