一道算法题:求出异或和为零的最长连续子串

最近看见一道算法题,本着见题解题的学习心态解决了它,由于目前正在研究正则表达式,所以就从正则的方向入手了:
题目如下:

输入N个整数,中间用空格隔开,求出异或和为0的最长连续子串。要求输出子串的长度、子串在输入的数组中的起始位置和结束位置。如果不存在这样的子串则输出-1.

代码如下:

import re
x = input('请输入')
#将输入的整数去掉空格并分别存入列表备用,用来最后比对子串的位置。
z = re.split(r'\s+',x)
#定义空列表用来存放所有符合异或和为0的连续子串
lis = []
while 1:
#首先查找是否存在符合条件的子串
    res1 = re.search(r'((\d+)\s+\2\s*)+',x)
    if not res1:break
#如果存在的话就把它保存到列表中
    lis.append(res1.group().strip())
#并且删除该子串,以便进行后续查找。
    x = re.sub(r'((\d+)\s+\2\s*)+','',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的,欢迎各位学长指教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值