2012-07-13 199 views
1

我有一個字符串,其中有數以千計的數字。我需要瀏覽字符串並找到數字順序最長的一組字符。例如:在Python中以字符串的數字順序查找最長的字符串

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] 

這裏是我的邏輯:檢查看看第一個數字是否小於或等於第二個數字。如果是,那兩個數字按數字順序排列。將第一個數字添加到空字符串中。繼續這樣做直到第一個數字大於第二個數字時碰到一個點。達到這一點之後,保存你已經作爲一個字符串並繼續你離開的地方,除了這次將你累積的數字連接到一個不同的字符串。在你有兩串數字之後,比較兩個數字並取較高的數字。繼續執行,直到完成字符串的處理。我希望這是有道理的,很難解釋。

回答

2

字符串索引爲0.所以如果您嘗試訪問some_str[len(some_str)],您將得到一個IndexError,因爲該字符串的最高索引是len(some_str) - 1。將您的while條件更改爲:while a < len(myString):。另外,您不應該使用string作爲變量,因爲它可能會掩蓋python string模塊名稱。

+2

的'string'模塊很少使用這些天,而且,無論如何,擁有該名稱的變量不會阻止您從模塊導入。當你使用諸如'str'這樣的內置名字時,陰影只是一個問題。 – MRAB 2012-07-14 01:08:49

1

問題是你太多次遞增a。因此,當a等於字符串長度時(a = 16),程序將中斷。將第三行更改爲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' 
+0

他不僅迭代了太多次......他也在比較相同的數字:) a = 0和b = 0並且兩者都在最後增加。 – 2012-07-13 20:54:09

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 
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' 
相關問題