2016-11-09 68 views
0

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更快?

+0

这不是很习惯Python,我猜你的第一语言是类C的。例如,我们写'for i,char in enumerate(s)' –

+0

,而不是'in for range(0,len(s))“。我星期一开始使用Python :) – ZouJS

回答

2

首先,range正在生成并在“for”版本中丢弃大量的数字数组作为循环索引。就像10000个数组每个平均5000个项目一样。尝试用xrange(生成器版本)替换range,您不会那么做。

+0

我是按照你说的去做的,它已经修好了。非常感谢! – ZouJS

+0

如果你能“接受”我的答案,那将是非常棒的:) –

+0

这是我第一次使用stackoverflow.so我该如何接受它? – ZouJS