2018暑假第三題
題目:
給定一個字串,找出不含有重複字元的最長子串的長度。(python)
示例:
給定 "abcabcbb"
,沒有重複字元的最長子串是 "abc"
,那麼長度就是3。
給定 "bbbbb"
,最長的子串就是 "b"
,長度是1。
給定 "pwwkew"
,最長子串是 "wke"
,長度是3。請注意答案必須是一個子串,"pwke"
是 子序列 而不是子串。
連結:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/description/
方法一:
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
str1 = []
temp = 0
x = 0
for i in range(0,len(s)):
for j in range(i,len(s)):
if s[j] in str1:
x = len(str1)
break
else:
str1.append(s[j])
x = len(str1)
if x>temp:
temp = x
str1 = []
else:
str1=[]
return temp
本方法無法提交。。。因為後面的測試時間比較長,超時了,但是結果是對的
方法二:
https://blog.csdn.net/together_cz/article/details/77533121 這個是下面程式碼的部落格,我把他複製過來為了寫註釋
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
res_list=[]
length=len(s)
for i in range(length):
tmp=s[i]
for j in range(i+1, length):
if s[j] not in tmp:
tmp+=s[j]
else:
break
res_list.append(tmp)
res_list.sort(lambda x,y:cmp(len(x),len(y))) //把res_list中的字串按長短排序
res = res_list[-1] //取最長的一個
return len(res) //返回其長度
這個是我在網上找的,但是,也是提交不上去,因為res_list[-1]報錯:索引超出範圍。。。明明可以執行。好氣啊!
後來補充:
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
n = len(s)
ans = 0
dic = {} //建立一個空字典
i = 0
for j in range(n):
if s[j] in dic:
i = max(dic.get(s[j]),i) //若字元已存在,則將子串的開頭索引(i)向後移動
ans = max(ans,j-i+1) //子串長度取當前最長值
dic[s[j]] = j+1 //字典中鍵為字串中的字母,值為該字元索引
return ans
這個程式碼是我把閱讀解答裡面的java程式碼改成python了,可以提交通過。