2016-11-09 42 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

相關問題