求最長不重複子字符串spa
題目來源:code
https://leetcode.com/problems/longest-substring-without-repeating-characters/blog
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.leetcode
Given "bbbbb"
, the answer is "b"
, with the length of 1.字符串
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.get
1,兩個循環,複雜度O(n2)string
先外面一個循環,遍歷每一個的時候,再遍歷當前位置以後的全部字符串,設一個tmp用來存儲,若是發現重複的就break,可是這個容易TLEit
def find_long_norepeat_str(one_str): #沒經過,複雜度過高,兩個for循環,複雜度 O(n2) res_list='' length=len(one_str) for i in range(length): tmp=one_str[i] for j in range(i+1,length): if one_str[j] in tmp: break else: tmp+=one_str[j] if len(tmp)> len(res_list): res_list=tmp return res_list
2.不遍歷後面了,看前面的for循環
仍是先循環一遍 ,遍歷每一個的時候,找之前的字符串,如"abcabcbb",第一個abc正常跑,記錄數量res,到了第2個a的時候,發現以前有重複了a,那就從下一個位置開始find,cur記錄當前s[i]之前出現過的那個位置的,curbegin是記錄find從哪一個位置開始找,一旦發現有重複,curbegin在下一次循環中就後移了,res就是記錄 你當前的位置 - 搜索起點的位置,也就是最大不重複子串。複雜度要好點。class
def find_sonstr_lis(s): if len(s)<=1: return len(s) res=1 curbegin=0 for i in range(len(s)): cur=s.find(s[i],curbegin,i) if cur!=-1: if i-curbegin>res: res=i-curbegin value=s[curbegin:i] curbegin=cur+1 if s.find(s[-1],curbegin,len(s)-1)==-1: res=max(res,len(s)-curbegin) return res