最近看見一道演算法題,本著見題解題的學習心態解決了它,由於目前正在研究正規表示式,所以就從正則的方向入手了:
題目如下:
輸入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的,歡迎各位學長指教。