SUBJECT:给定一个字符串,找出最长的子字符串的长度而不重复字符。 CODE:为什么在这个python函数中WHILE比FOR更有效
import time
import string
import random
class Solution:
def getRandomStr(self,length):
s = ""
for x in range(0,length):
s += random.choice(string.ascii_letters+string.digits)
return s
# O(n)
def hasValue(self,s,v,p,r):
for k in range(p,r+1):
if s[k] == v:
return True
return False
# O(n^3)
# if s[j] is found in prestr ,
def lengthOfLongestSubstringWhile(self,s):
maxlen = 0
i = 0
j = 0
exitsign = False
t0 = time.clock()
while i < len(s):
j = i+1
while j < len(s):
if self.hasValue(s,s[j],i,j-1):
maxlen = max(maxlen,j-i)
break
elif j == len(s)-1:
maxlen = max(maxlen,j-i+1)
exitsign = True
break
j+=1
if exitsign:
break
i+=1
# print maxlen
def lengthOfLongestSubstringFor(self,s):
maxlen = 0
exitsign = False
for i in range(0,len(s)):
for j in range(i+1,len(s)):
if self.hasValue(s,s[j],i,j-1):
maxlen = max(maxlen,j-i)
break
elif j == len(s)-1:
maxlen = max(maxlen,j-i+1)
exitsign = True
break
if exitsign:
break
# print maxlen
S = Solution()
s = S.getRandomStr(10000)
t0 = time.clock()
S.lengthOfLongestSubstringWhile(s)
t1 = time.clock()
S.lengthOfLongestSubstringFor(s)
t2 = time.clock()
print t1-t0,t2-t1
这是结果:
0.187118
0.868182
完成了1.2秒
为什么用0功能比for
更快?
这不是很习惯Python,我猜你的第一语言是类C的。例如,我们写'for i,char in enumerate(s)' –
,而不是'in for range(0,len(s))“。我星期一开始使用Python :) – ZouJS