主题:给定一个字符串,求最长子字符串的长度,不要重复字符。 代码:
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秒完成
为什么带while
的函数比带for
的函数更快?你知道吗
首先,
range
在“For”版本中生成并丢弃大量的数字数组作为循环索引。比如,10000个数组,平均每个数组有5000个项目。试着用xrange
(生成器版本)替换range
,你不会做太多。你知道吗相关问题 更多 >
编程相关推荐