一道演算法題:求出異或和為零的最長連續子串

格瑞姆瑞坡發表於2019-02-16

最近看見一道演算法題,本著見題解題的學習心態解決了它,由於目前正在研究正規表示式,所以就從正則的方向入手了:
題目如下:

輸入N個整數,中間用空格隔開,求出異或和為0的最長連續子串。要求輸出子串的長度、子串在輸入的陣列中的起始位置和結束位置。如果不存在這樣的子串則輸出-1.

程式碼如下:

import re
x = input(`請輸入`)
#將輸入的整數去掉空格並分別存入列表備用,用來最後比對子串的位置。
z = re.split(r`s+`,x)
#定義空列表用來存放所有符合異或和為0的連續子串
lis = []
while 1:
#首先查詢是否存在符合條件的子串
    res1 = re.search(r`((d+)s+2s*)+`,x)
    if not res1:break
#如果存在的話就把它儲存到列表中
    lis.append(res1.group().strip())
#並且刪除該子串,以便進行後續查詢。
    x = re.sub(r`((d+)s+2s*)+`,``,x,1)
if lis: 
#對查詢結果進行篩選,把列表中每個子串轉再換成列表   
    for i in range(len(lis)):
        lis[i] = re.split(r`s+`,lis[i])
#建立字典,key為每個子串長度,value為每個子串的列表形式
    dic = {len(lis[i]):lis[i] for i in range(len(lis))}
#求出最長的子串
    max_str = dic[max(dic)]
    a = len(max_str)
    for i in range(len(z)-a+1):
        if z[i:i+a] == max_str:
            b = i+1
            break
    c = b+a-1
    print(a,b,c)
else:
    print(`-1`)

我自己測試一千多條資料是OK的,歡迎各位學長指教。

相關文章