1

我有一个包含数千个数字的字符串。我需要遍历字符串并找到按数字顺序排列的最长字符集。例如:

string = '1223123341223455'

该字符串中按数字顺序排列的最长字符串为 1223455,长度为 7 个字符。这是我目前拥有的示例:

r=r2=''
a=b=0
 while a < len(string)+1:
    if string[a] <= string[b]:
        r += string[a]
    else:
        if len(r) < len(r2):
            r = r2
    a += 1
    b += 1

有了这个,它告诉我字符串索引超出了行的范围:

if string[a] <= string[b]

这是我的逻辑:检查第一个数字是否小于或等于第二个数字。如果是,这两个数字是按数字顺序排列的。将第一个数字添加到空字符串。继续这样做,直到遇到第一个数字大于第二个数字的点。达到这一点后,将您拥有的内容保存为字符串并从上次中断的地方继续,除了这次将您累积的数字连接到不同的字符串。得到两串数字后,比较两者并取较大的一个。继续此操作,直到您处理完字符串。我希望这是有道理的,有点难以解释。

4

4 回答 4

2

字符串的索引为 0。因此,如果您尝试访问some_str[len(some_str)],您将得到一个,IndexError因为该字符串的最高索引是len(some_str) - 1. 将您的条件更改while为:while a < len(myString):。此外,您不应将string其用作变量,因为它可能会掩盖 pythonstring模块名称。

于 2012-07-13T20:39:44.707 回答
1

问题是你增加a了太多次。因此,当 a 等于字符串 ( a = 16) 的长度时,程序会中断。将您的第 3 行更改为while a < len(string):应该修复它。

另外,我不太确定你在用你的变量做什么。您声明了从未使用过的 r1,并且您在未声明的情况下使用了 r2。这个问题比你的方法更容易解决 - 下面的代码似乎可以满足你的要求:

>>> r=longest=''
>>> for a in range(1:len(string)):
        if (string[a-1] <= string[a]) or len(r)==0:
            r += string[a]
        else:
        r = string[a]       // We need to reset r if the string is not in numerical order
        if len(r) > len(longest):
            longest = r
        a += 1
>>> longest
'1223455'
于 2012-07-13T20:41:54.967 回答
1

首先确保你有几件事要测试和预期的结果,包括边界情况。

strings = {
    '1223123341223455': '1223455',  # at the end
    '1': '1',                       # just one
    '12321': '123',                 # at the start
    '212321': '123',                # in the middle
    '': '',                         # empty
    '123234': '123',                # two of same length, take the first
    '12231233412234552': '1223455', # at the end -1 testing the try 

}

然后搜索最长的字符串,而不将到目前为止找到的实际字符附加到某个临时字符串。那是低效的。您只需要知道最长字符串的起始索引及其长度:

def longest(s):
    max_start = 0
    this_start = 0
    max_length_minus_one = 0
    for x in range(len(s)-1):
        if s[x] > s[x+1]:
            length_found = x - this_start
            if length_found > max_length_minus_one:
                max_length_minus_one = length_found
                max_start = this_start
            this_start = x + 1
    try:
        # test the final string position
        length_found = x + 1 - this_start
        if length_found > max_length_minus_one:
            max_length_minus_one = length_found
            max_start = this_start
    except UnboundLocalError:
        pass # empty string throws this exception
    return s[max_start:max_start+max_length_minus_one+1]

现在在测试用例上运行它并检查输出:

for s, check in strings.iteritems():
    res = longest(s)
    print repr(s), repr(res), 'OK' if res == check else '<<<<< ERROR'
于 2012-07-14T07:17:03.050 回答
0
string = '1223123341223455'

longest = ''
r = ''

for i in range(len(string)):
    j = i+1
    r += string[i]

    if j > len(string)-1 or string[i] > string[j]:
        if len(r) > len(longest):
            longest = r
            r = ''


print longest # 1223455
于 2012-07-13T20:45:32.147 回答