我的python似乎適用於輸入字符串的長度不是很大,但是很長的字符串失敗了。問題說明如下:來自topcoder srm的特殊字符串問題634 div 2
字符串S在滿足以下兩個屬性時稱爲特殊字符: S中的每個字符都是'0'或'1'。 每當S = UV,其中U和V都是非空字符串時,U按照字典順序嚴格小於V. 例如,字符串S =「00101」是特殊的,因爲我們具有「0」<「0101」,「00」<「101」,「001」<「01」和「0010」<「1」。 給你一個保證特殊的字符串電流。設N是當前的長度。考慮按字母順序排列的所有長度爲N的特殊字符串的列表。計算並返回列表中當前緊接的字符串。如果當前恰好是列表中的最後一個字符串,請返回空字符串。
這裏是我的Python代碼:
class SpecialStrings(object):
def findNext(self, current):
if current == '0':
return '1'
N = len(current)
iter_times = 2 ** N - int(current, 2) - 1
temp_current = current
for i in range(iter_times):
temp_s = self.get_next_string(temp_current)
if self.is_special(temp_s):
return temp_s
if temp_s[0] == '1':
return ''
temp_current = temp_s
return ''
def get_next_string(self, s):
next_string = bin(int(s, 2) + 1)
next_string = next_string[2:]
if len(next_string) < len(s):
temp_zero = '0' * (len(s) - len(next_string))
next_string = temp_zero + next_string
return next_string
def is_special(self, s):
for i in range(1, len(s)):
left = s[:i]
right = s[i:]
if left >= right:
return False
return True
我收到異常終止與輸入 「0111111111111111111111111111」 和 「001111111111111111111111111111111111111111」。當我試圖用它們中的任何一個在本地進行測試時,我的電腦內存已經耗盡......
這裏有什麼問題?是否因爲我的算法效率不高?如何解決它?
非常感謝你!!!!!
這些是林登的單詞。請參閱http://en.wikipedia.org/wiki/Lyndon_word。 – rici 2014-10-01 04:16:42
非常感謝! – ChesterL 2014-10-01 14:47:59