来自topcoder srm 634 div 2的SpecialStrings prob

时间:2014-09-30 23:15:38

标签: python string algorithm

我的python看起来工作时输入字符串的长度不是很大,但是很长的字符串失败了。这是问题陈述:

如果字符串S满足以下两个属性,则称为特殊字符串: S中的每个字符都是' 0' 0或者' 1'。 每当S = UV,其中U和V都是非空字符串时,U在字典顺序中严格小于V. 例如,字符串S =" 00101"很特别,因为我们有" 0" < " 0101"," 00" < " 101"," 001" < " 01"," 0010" < " 1&#34 ;. 您将获得一个保证特殊的字符串电流。设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

我收到输入异常终止&#34; 0111111111111111111111111111&#34;和&#34; 001111111111111111111111111111111111111111&#34;。当我尝试用它们中的任何一个在本地测试时,我的计算机内存已经耗尽......

这里有什么问题?是因为我的算法效率不高吗?怎么解决?

非常感谢!!!!!

1 个答案:

答案 0 :(得分:0)

你可能正在使用Python2。在Py2中,range()(您的第8行)返回一个列表。例如。 range(3)返回[0,1,2]。所以range(iter_times)会创建一个耗尽内存的大型列表。简单的解决方法:改为使用xrangeRefer


但是使用xrange,您很快就会收到另一个错误:

  

OverflowError:Python int太大而无法转换为C long

因为传递给xrange的参数不应超过max signed long。例如。在我的计算机xrange(0x7fffffff)中没问题,而xrange(0x80000000)可以触发错误。 Refer

解决方法:在第8行中,使用while True:代替。因为如果代码按预期工作,那么循环应该在到达for循环结束之前返回结果或空字符串。所以不需要使用for循环。


下一个麻烦,当你使用'while True'时,输入'0111111111111111111111111111'应该可以正常工作,但'001111111111111111111111111111111111111111'将继续计算。这就是算法问题。你使用蛮力,预计大输入的计算时间长。您可能需要找到特殊字符串的模式来改进算法。